下载nodejs
官网下载Node.js — Run JavaScript Everywhere,一路安装就可以了
文件夹中命令窗口
npm init
根据提示同意会创建一个package.json文件

接下来安装grpc-js包,也可以安装grpc,grpc是C++版本,grpc-js是js版本,C++版本停止维护了。所以用grpc-js版本。
npm install @grpc/grpc-js
接着安装proto-loader用来动态解析proto文件
npm install @grpc/proto-loader
我们再安装email处理的库
npm install nodemailer
在写代码发送邮件之前,我们先去邮箱开启smtp服务。我用的163邮箱,在邮箱设置中查找smtp服务器地址,需要开启smtp服务。这个是固定的,不需要修改。
网易163邮箱的 SMTP 服务器地址为: smtp.163.com
发送邮件,建议使用授权码(有的邮箱叫 独立密码),确保邮箱密码的安全性。授权码在邮箱设置中进行设置。如果开启了授权码,发送邮件的时候,必须使用授权码。
这里设置开启smtp服务和授权码。


因为我们要实现参数可配置,所以要读取配置,先在文件夹内创建一个config.json文件
{
"email": {
"user": "@163.com",
"pass": ""
},
"mysql":{
"host":"127.0.0.1",
"port":3306,
"passwd":
},
"redis":{
"host":"47.113.193.180",
"port":6379,
"passwd":123456
}
}
user是我们得邮箱地址,pass是邮箱得授权码,只有有了授权码才能用代码发邮件
另外我们也要用到一些常量和全局得变量,所以我们定义一个const.js
const fs = require('fs');
let config = JSON.parse(fs.readFileSync('config.json', 'utf8')); //解析config.json文件中的数据保存在config类中
let email_user = config.email.user;
let email_pass = config.email.pass;
let mysql_host = config.mysql.host;
let mysql_port = config.mysql.port;
let mysql_passwd = config.mysql.passwd;
let redis_host = config.redis.host;
let redis_port = config.redis.port;
let redis_passwd = config.redis.passwd;
let code_prefix = "code_";
module.exports = {email_pass, email_user, mysql_host, mysql_port,redis_host, redis_port, redis_passwd, code_prefix,mysql_passwd} //导出外部使用的对象
接下来封装发邮件的模块,新建一个email.js文件
const nodemailer = require('nodemailer'); //包含要使用的库
const config_module = require("./config")//包含要使用的库
/**
* 创建发送邮件的代理
*/
let transport = nodemailer.createTransport({ //创建发送邮件的代理
host: 'smtp.163.com', //使用服务的地址
port: 465, //服务的端口,网上查
secure: true, //否使用安全连接
auth: {
user: config_module.email_user, // 发送方邮箱地址
pass: config_module.email_pass // 邮箱授权码或者密码
}
});
/**
* 发送邮件的函数
* @param {*} mailOptions_ 发送邮件的参数
* @returns
*/
function SendMail(mailOptions_){
return new Promise(function(resolve, reject){ //reject程序有错返回,resolve正常返回
/*Promise 如同c++中的future
Promise中有一个await函数,future中有wait()函数,等待async函数的返回。这两个等待函数都需要在async异步函数中使用
*/
transport.sendMail(mailOptions_, function(error, info){ //sendMail是一个异步函数,结果返回并不代表邮件发送成功,所以需要使用Promise进行管理
if (error) {
console.log(error);
reject(error);
} else {
console.log('邮件已成功发送:' + info.response);
resolve(info.response)
}
});
})
}
module.exports.SendMail = SendMail //导出函数
我们新建server.js,用来启动grpc server
//接口实现
async function GetVarifyCode(call, callback) { //call是请求 ,callback回复,需要和message.proto中的参数对应
console.log("email is ", call.request.email)
try{
uniqueId = uuidv4(); //生成验证码
console.log("uniqueId is ", uniqueId)
let text_str = '您的验证码为'+ uniqueId +'请三分钟内完成注册'
//发送邮件
let mailOptions = {
from: 'secondtonone1@163.com', //发送的地址
to: call.request.email, //发到的邮箱地址
subject: '验证码',
text: text_str, //发送的内容
};
let send_res = await emailModule.SendMail(mailOptions); //通过被promise管理的异步函数发送邮件,使用await等待发送返回的结果
console.log("send res is ", send_res)
callback(null, { email: call.request.email,
error:const_module.Errors.Success
}); //返回的内容,
}catch(error){
console.log("catch error is ", error)
callback(null, { email: call.request.email,
error:const_module.Errors.Exception
});
}
}
function main() {
var server = new grpc.Server()
server.addService(message_proto.VarifyService.service, { GetVarifyCode: GetVarifyCode })
//message_proto.VarifyService.service,message.proto文件中自己声明的函数 第一个GetVarifyCode是服务的名字,第二个是调用的接口
server.bindAsync('0.0.0.0:50051', grpc.ServerCredentials.createInsecure(), () => {//grpc.ServerCredentials.createInsecure()安全校验
server.start()
console.log('grpc server started')
})
}
main()
在nodejs中使用npm run server启动 //server是自己设置的名字,在package.json文件中的main字段的值接收服务的名字
2332

被折叠的 条评论
为什么被折叠?



