const express = require("express");
const fetch = require("node-fetch");
const bodyParser = require('body-parser');
const multer = require('multer');
const upload = multer();
const redis = require("redis");
// const io = require("socket.io")(3000);
const crypto = require('crypto');
const PORT = process.env.PORT || 5000;
const REDIS_PORT = process.env.PORT || 6379;
const client = redis.createClient(REDIS_PORT);
// io.on("connection", socket => {
// socket.emit("chat-message", "Hello World");
// });
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
function creatRes(code) {
let stat = code > 1000 ? "FAILED" : "SUCCESS";
let message = {
0 : "ACTION SUCCESS",
1001 : "user exists!",
1002 : "hgetall error!",
1003 : "incr userid error!",
1004 : "hmset user error!",
}
return { status: stat, errno: code, message: message[code] };
}
app.post("/user/register", upload.array(), async (req, res) => {
// console.log("username: ", req.body.username);
// console.log(req.body);
let { username, password, email } = req.body;
let md5 = crypto.createHash("md5");
let hashPwd = md5.update(password).digest("hex");
// console.log(hashPwd);
let userKey = `chatapp:user:${email}`;
// ================== Promise [ begin ] ==================
let searchFunc = (resolve, reject) => {
client.hgetall(userKey, (err, data) => {
if (err) {
console.log(err);
reject( creatRes(1002) );
}
if (data !== null) {
console.log("user exists!");
reject( creatRes(1001) );
} else {
resolve();
}
})
};
let incrFunc = (resolve, reject) => {
let incrKey = "chatapp:userid";
client.incr(incrKey, function(err, latestUserId) {
if (err) {
console.log(err);
reject( creatRes(1003) );
}
console.log("latest userid:", latestUserId);
resolve(latestUserId)
})
}
let hmsetFunc = (latestUserId) => {
return new Promise((resolve, reject) => {
let val = {
username: username,
password: hashPwd,
userid: latestUserId
}
client.hmset(userKey, val, function(err, res) {
if (err) {
console.log(err);
reject( creatRes(1004) );
}
console.log("hmset res:", res);
resolve( creatRes(0) );
})
})
}
let useAsyncAwait = 1
if (useAsyncAwait) { // 使用 async await, 明显阅读起来比较舒服
console.log("use async & await.");
try {
await new Promise(searchFunc);
let latestUserId = await new Promise(incrFunc);
let result = await hmsetFunc(latestUserId);
console.log(result);
res.json( result );
} catch (err) {
console.log(err);
res.json( err );
}
} else { // 不使用 async await, 阅读起来比嵌套好,但比 async await 差点意思
console.log("only Promise.");
new Promise(searchFunc)
.then(() => {
return new Promise(incrFunc)
})
.then((latestUserId) => {
return hmsetFunc(latestUserId)
})
.then((result) => {
console.log(result);
res.json( result );
}).catch( err => {
console.log(err);
res.json( err );
})
}
// ================== Promise [ end ] ==================
});
app.listen(5000, () => {
console.log(`App listening on port ${PORT}`);
});
网友评论