node.js就是javascript语言 先package.json 不废话
{
"name":
"node_app",
"version":
"1.0.0",
"main":
"app.js",
"dependencies": {
"@alicloud/sms-sdk":
"^1.0.3",
"async":
"^2.6.0",
"body-parser":
"^1.18.2",
"cookie-parser":
"^1.4.3",
"express":
"^4.16.2",
"mongodb":
"^2.2.33",
"supervisor":
"^0.12.0"
},
"devDependencies": {},
"scripts": {
"test":
"echo \"Error: no test specified\" && exit 1",
"start":
"node app.js"
},
"author":
"",
"license":
"ISC",
"description":
""
}
async 使用并行有关联可以使逻辑代码更清晰
body-parser cookie-parser 获取参数
express 脚手架必备
mongodb 数据库
supervisor 保存后自动重启服务
cnpm i 后 编写代码
下面是我的目录结构
登陆注册的逻辑专门写在login里 商品的逻辑写在good里 app只写接口和向前段发送数据
先写连接数据库
在db.js里面
const
mongodb =
require(
"mongodb");
const
MongoClient =
mongodb.
MongoClient;
const
DB_CONN_STAR =
"mongodb://localhost:27017/meihua"; //
localhost:27017数据库连接地址 meihua数据库名称
module.
exports = {
conn:
function(
callback){
MongoClient.
connect(
DB_CONN_STAR,(
err,
db)
=>{
if(
err){
console.
log(
"数据库连接失败");
callback(
err,
null);
}
else{
console.
log(
"数据库连接成功");
callback(
null,
db);
}
})
}
}
下面是app.js代码
const
express =
require(
"express");
const
app =
express();
const
dbs =
require(
"./db");
var
async =
require(
"async");
const
host =
"0.0.0.0"; //表示什么接口都可访问 写内网地址
const
port =
"4000"; //端口
var
cookieParser =
require(
'cookie-parser');
// 方便操作cookies
var
bodyParser =
require(
'body-parser');
// 获取 请求的参数 post
app.
use(
bodyParser.
json());
// 接口 http://localhost:7000/login?username=qwer ajax req.body
app.
use(
bodyParser.
urlencoded({
extended:
false }));
// form 表单提交
app.
use(
cookieParser());
app.
all(
'*',
function(
req,
res,
next){
// res.header("Access-Control-Allow-Headers","Access-Control-Allow-Headers")
res.
header(
"Access-Control-Allow-Origin",
"*");
res.
header(
"Access-Control-Allow-Headers",
"X-Requested-With,Content-Type");
res.
header(
"Access-Control-Allow-Methods",
"PUT,POST,GET,DELETE,OPTIONS");
res.
header(
"X-Powered-By",
' 3.2.1');
next();
});
//访问根基目录下的html静态文件
// const path = require("path");
// app.use("/html",express.static(path.join(__dirname,"html")));
var
regConfirm =
require(
"./login/regconfirm.js");
var
register =
require(
"./login/register.js");
var
login =
require(
"./login/login.js");
var
finConfirm =
require(
"./login/finConfirm.js");
// var changepwd = require("./login/changepwd.js");
app.
get(
"/",(
req,
res)
=>{
res.
send(
"连接成功");
})
接口 //注册 验证码接口
app.
post(
"/user/confirm",(
req,
res)
=>{
var {
tel} =
req.
body;
console.
log(
tel)
var
code =
Math.
round(
Math.
random()*
9000 +
1000);
dbs.
conn((
err,
db)
=>{
if(
err)
throw
err;
regConfirm.
func(
db , {
tel,
code} ,(
result)
=>{
res.
json(
result);
db.
close();
})
})
})
//register的逻辑
app.
post(
"/user/register",(
req,
res)
=>{
var {
tel,
pwd} =
req.
body;
console.
log(
tel)
console.
log(
req.
body)
dbs.
conn((
err,
db)
=>{
if(
err)
throw
err;
register.
func(
db,{
tel,
pwd},(
result)
=>{
res.
send(
result);
db.
close();
})
})
})
app.
listen(
port,
host,()
=>{
console.
log(
`the srever is running at http://
${
host
}
:
${
port
}
` )
})
login目录
regConfirm.js代码 说不清楚逻辑都写在上面自己看 太长了选择用csdn官方编译器
//confirm的逻辑
//判断手机号码是否存在
// 1,存在则返回code 2,不存在 请注册 返回编码 “1” 存在 输入验证码后 选择是否找回密码或者更换手机号码“2”
// 返回 “0” 服务器错误
//不论如何 都会更新数据库 手机号码
const SMSClient = require('@alicloud/sms-sdk');
const accessKeyId = 'XXXXXXXXXX';// 自己注册的id
const secretAccessKey = 'XXXXXXXXXXXXX'; //注册短信接口mi
const async = require("async");
regConfirm = (db,{tel,code},callback) => {
var telcode = db.collection("telcode");
var user = db.collection("user");
async.waterfall([
function(callback){
//查询是否存在 "1"发送短信成功 "2"发送短信失败 "3"已经注册过
user.find({usertel:tel},{}).toArray((err,result)=>{
console.log(tel+"---------")
if(err) throw err;
if(result.length>0){
console.log("已经注册过")
callback(null,"3");
}else{
console.log("没有注册过,发送短信");
let smsClient = new SMSClient({accessKeyId, secretAccessKey});
smsClient.sendSMS({
PhoneNumbers: tel,
SignName: 'XXXXXXX',//自己注册的模版名字
TemplateCode: 'XXXXXXXX', //自己注册的模版id
TemplateParam: `{"code":${code}}` //随机自己生成的验证码
}).then(function (res) {
let {Code}= res;
if (Code === 'OK') {
console.log("短信发送成功")
callback(null,"1");
}
}, function (err) {
console.log("短信发送失败" + err)
callback(null,"2");
})
}
})
},
function(arg,callback){
if(arg == "1"){
//可以新增 判断手机号码是否已经发送过验证码 "1" 不存在新增 "2"存在修改 "3"短信发送失败 "4"已经注册过
telcode.find({tel},{}).toArray((err,result)=>{
if(err) throw err;
if(result.length>0){
callback(null,"2",code);
}else{
callback(null,"1",code);
}
})
}else if(arg == "2"){
callback(null,"3",code);
}else{
callback(null,"4",code);
}
},function(arg1,arg2,callback){
//type "1"
switch(arg1){
case "1"://不存在 新增
console.log("没发过验证码");
telcode.insert({tel,code},(err,info)=>{
if(err) throw err;
var obj = {
code,
type:1,
msg:"验证码已发送"
};
callback(null,obj);
})
break;
case "2"://存在 修改
console.log("发过验证码");
telcode.update({tel},{$set:{code:code}},(err,info)=>{
if(err) throw err;
var obj = {
code,
type:1,
msg:"验证码已发送"
};
callback(null,obj);
})
break;
case "3"://验证码发送失败
console.log("验证码发送失败");
var obj = {
code,
type:2,
msg:"验证码发送失败"
};
callback(null,obj);
break;
case "4"://用户存在 是否找回密码
console.log("用户存在 是否找回密码")
var obj = {
code,
type:3,
msg:"用户已注册,是否找回密码"
};
callback(null,obj);
break;
}
}
],function(err,result){
// "1"发送验证码 "2"验证码发送失败 "3"用户注册过,是否找回密码
console.log(result)
if(err) throw err;
callback(result);
})
}
exports.func = regConfirm;
register.js代码
register = (db,{tel,pwd},callback) =>{
var user = db.collection("user");
user.insert({usertel:tel,userpwd:pwd},(err,info)=>{
if(err) throw err;
console.log("新增成功")
callback(true)
})
}
exports.func = register;
//数据库 简单数据查询
app.get("/find",(req,res)=>{
dbs.conn((err,db)=>{
if(err) throw err;
var find = db.collection("find");
find.find({}).toArray((error,result)=>{
if(error) throw error;
console.log("find数据获取")
res.send(result);
db.close();
})
})
})
逻辑代码 和 接口分开写 更利于管理如果借口很少就没有必要了 我这个是最简单的node 感觉比php简单一些
最后推到线上就可以了