在運行應用程式并測驗 /signup 路由時,資料被寫入資料庫,我可以從 database/models.js 檔案中對其進行 console.log,但在 routes/index.js 檔案中它回傳“出了點問題”。郵遞員什么也沒顯示,甚至沒有空陣列或物件。
路線/index.js
var express = require('express');
var router = express.Router();
const database = require('../database/models');
router.post('/signup', function(req, res, next) {
if (!req.body.email || !isValidEmail(req.body.email))
res.status(400).send('Email invalid.');
else if (!req.body.username || !isValidCredential(req.body.username) || !req.body.password || !isValidCredential(req.body.password))
res.status(400).send('Username/password invalid.');
else {
const result = database.createUser(req.body.email, req.body.username, req.body.password);
if (result)
res.status(200).send(result);
else
res.send('Something went wrong.');
}
});
function isValidEmail (email) {
if (email.match("[a-z0-9!#$%&'* /=?^_`{|}~-] (?:\.[a-z0-9!#$%&'* /=?^_`{|}~-] )*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.) [a-z0-9](?:[a-z0-9-]*[a-z0-9])?"))
return true;
else
return false;
}
function isValidCredential (credential) {
if (credential.length < 6)
return false;
else if (credential.match(/^[a-z0-9] $/i))
return true;
else
return false;
}
module.exports = router;
資料庫/models.js
const tools = require('./tools');
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const userSchema = new Schema({
email: String,
username: String,
hashedPassword: String,
salt: String,
accessToken: { type: String, default: "" }
});
const User = mongoose.model('User', userSchema);
function createUser(email, username, password) {
const hashPass = tools.generatePassword(password);
const newUser = new User({
email: email,
username: username,
hashedPassword: hashPass.hash,
salt: hashPass.salt
});
newUser.save(function (error, result) {
if (error)
return handleError(error);
return { email: result.email, username: result.username };
});
}
module.exports.createUser = createUser;
uj5u.com熱心網友回復:
createUser在您的代碼中,呼叫函式時您不會回傳任何內容。這里有幾個考慮:
// index.js
const result = database.createUser(req.body.email, req.body.username, req.body.password);
由于這createUser是對資料庫執行的操作,因此它可能是異步的,因此也是異步的結果。我建議使用 async/await 來確定回傳的結果。此外,您需要更改models.js檔案的代碼以回傳 Promise 并等待它。
function createUser(email, username, password) {
const hashPass = tools.generatePassword(password);
const newUser = new User({
email: email,
username: username,
hashedPassword: hashPass.hash,
salt: hashPass.salt
});
return new Promise((resolve, reject)=> {
newUser.save(function (error, result) {
if (error) reject(error);
resolve({ email: result.email, username: result.username });
});
});
}
而你將不得不await為你的結果。您可以通過以下方式執行此操作:
// index.js
// Add async here
router.post('/signup', async function(req, res, next) {
// ...other code
// Add await here
const result = await database.createUser(req.body.email, req.body.username, req.body.password);
uj5u.com熱心網友回復:
我想到了。
在 routes/index.js 中使用 async/await 像這樣:
router.post('/signup', async function(req, res, next) {
try {
if (!req.body.email || !isValidEmail(req.body.email))
res.status(400).send('Email invalid.');
else if (!req.body.username || !isValidCredential(req.body.username) || !req.body.password || !isValidCredential(req.body.password))
res.status(400).send('Username/password invalid.');
else {
const result = await database.createUser(req.body.email, req.body.username, req.body.password);
if (result)
res.status(200).send(result);
else
res.status(403).send(result);
}
} catch (error) { return error; }
});
并且在 database/models.js 中也使用 async/await,但也將 mongoose 方法重寫為不帶回呼的方法,并回傳到變數中,如下所示:
async function createUser(email, username, password) {
try {
const hashPass = tools.generatePassword(password);
const newUser = new User({
email: email,
username: username,
hashedPassword: hashPass.hash,
salt: hashPass.salt
});
const result = await newUser.save();
return { email: result.email, username: result.username };
} catch (error) { console.log (error); return error; }
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/450011.html
上一篇:MongoError:聚合期間的PlanExecutor錯誤
下一篇:更新檔案陣列中的專案
