我無法理解awaitNode 與 mongoose 和 express 的使用。
基本上我有一個頁面/profile,根據連接的用戶,我為我擁有的每個獲取請求生成一個令牌:
router.get('/profile', requiresLogin, (req, res, next) => {
User.findById(req.session.userId).exec(function(err, user){
if(err || !user){
//Display error and return
return res.send("Error");
}
var token = Token.generateToken(user);
console.log("Token is: " token);
return res.send("Working");
}
})
生成令牌的函式如下:
TokenSchema.statics.generateToken = function(user){
const newToken = new this({
_userId: user._id,
token: crypto.randomBytes(16).toString('hex')
});
await newToken.save();
return newToken;
}
我收到一條錯誤await訊息:SyntaxError: await is only valid in async functions and the top level bodies of modules.
我認為代碼非常直觀,所以我想要完成的是有一個靜態函式來生成Token物件。然后這個函式將回傳并且其他方法(比如我發布的在 get 時執行的方法/profile)可以使用它來創建新的令牌。
這是實作我想要實作的目標的正確方法嗎?我想要關于如何做這個代碼更多“nodejs”的建議,因為我已經習慣了其他沒有承諾的語言等等,這是我能想到的最好的。我知道可以使用回呼等,但我認為它們可能會使代碼復雜化,因為它應該與其他語言一起使用。
謝謝!
更新:就在發布后,我看到洗掉了await我所期望的,但正如我在這里看到的那樣:
save() 方法是異步的,因此它回傳一個可以等待的承諾。
所以我真的不明白它是如何作業的,也不是為什么
uj5u.com熱心網友回復:
您不能await在非異步功能中使用,這意味著:
generateToken必須是async。generateToken在請求處理程式中呼叫時,您還必須await進行該呼叫。- 同樣,如果不
await將匿名處理函式標記為async.
您的處理程式應如下所示:
router.get("/profile", requiresLogin, (req, res, next) => {
User.findById(req.session.userId).exec(async (err, user) => {
if(err || !user) {
return res.send("Error");
}
const token = await Token.generateToken(user);
console.log("Token is: " token);
return res.send("Working");
});
});
以及令牌生成功能:
TokenSchema.statics.generateToken = async function(user) {
const newToken = new this({
_userId: user._id,
token: crypto.randomBytes(16).toString('hex')
});
await newToken.save();
return newToken;
}
您還可以async/await與 Mongoose 一起使用(而不是使用回呼),因此您的處理程式可能如下所示:
router.get("/profile", requiresLogin, async (req, res, next) => {
try {
const user = await User.findById(req.session.userId).exec();
if (!user) return res.send("Can't find user.");
const token = await Token.generateToken(user);
console.log("Token is: " token);
return res.send("Working");
} catch (err) {
return res.send("Error.");
}
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/497625.html
