我正在用Express創建一個REST API,以下是我的架構,一個路由器正在呼叫一個控制器,但我得到了這個錯誤,請幫助我
Error: Route.post()需要一個回呼函式,但得到一個[物件Promise]
/////// EmailLogin.js中間件處理程式
span class="hljs-keyword">const { validationResult } = require('express-validator')。
let wrapRoute = async(req, res, next)=> {
try {
//運行控制器邏輯。
await fn(req, res, next)
} catch (e) {
//如果出現了例外,不要發送任何回應。
//只是繼續執行中間件鏈。
next(e)
}
}
const EmailLogin = wrapRoute(async (req, res) => {
const errors = validationResult(req)。
if (!errors.isEmpty() } {
return res.status(422)。 json({ errors: errors.array() });
} else {
var gtoken = req.body.gtoken;
var gSecretKey = env.secret_key。
if (!gtoken) throw new Error('no token')
const captchaURL = `https://www.google.com/recaptcha/api/siteverify?secret=${gSecretKey}& response=${token}`
await axios({
url: captchaURL,
method: 'POST'。
headers: {ContentType: 'application/x-www-form-urlencoded'},
}).then(response => {
const gVerifyData = response.data
if (gVerifyData.success ==true) {
Users.findOne({'email': req.body.email})。) select(' hashPassword status').exec(function(err, user) {
if(err){
return res.status(500).send({err})。
} else if (user) {
validPassword = bcrypt.compareSync(req.body.password, user.hashPassword) 。
if (! validPassword){
return res.send("wrong-info"/span>)。
} else if (validPassword && user.status == "active" ) {
token = jwt.sign({ id: user._id }, env.jwtsecret,
{ expiresIn: "168h" })。)
res.status(200).send({ token: token, user }) 。
}
} else {
return res.send("wrong-info"/span>)。
}
}
)
}else {
return res.status(500).send('bot') 。
}
}).catch(error => {
console.log(error)。
});
}
});
function errorHandler (err, req, res, next) {
console.log(err)。
//如果err沒有指定錯誤代碼,將錯誤代碼設定為'內部服務器錯誤(500)'。
if (!err.statusCode) {
err.statusCode = 500;
}
res.status(err.statusCode).json({
status: false,
error: err.message。
});
};
module.exports = {EmailLogin};
我試圖在我的路由器中呼叫它,就像這樣:
Router.com>。
/////// Router.js
const express = require('express')。
const router = express.Router()。
const { check } = require('express-validator');
const EmailLoginController = require('./controllers/EmailLogin'/span>)。
var emailLoginValidation = [
check('email').notEmpty()。 trim().escape().isEmail()。
check('password')。notEmpty()。 isLength({ min: 7 }).withMessage('password is invalid') 。
];
router.post('/email-login', emailLoginValidation, EmailLoginController.EmailLogin) 。
module.exports = router;
/////// App.js
var express = require("express") 。
var app = express()。
const Router = require(' ./routes/Router')。
app.use('/', Router) 。
app.listen(3000, function(>/span>) {
console.log('listening on 3000')。
});
我可以做什么?是否有可能在Router中作為一個處理程式獲得一個承諾結果?
uj5u.com熱心網友回復:
@turkdev 將你的電子郵件登錄功能改為這樣
const EmailLogin = async(req, res, next)=> {
const errors = validationResult(req)。
if (!errors.isEmpty() } {
return res.status(422)。 json({ errors: errors.array() });
} else {
var gtoken = req.body.gtoken;
var gSecretKey = env.secret_key。
if (!gtoken) throw new Error('no token')
const captchaURL = `https://www.google.com/recaptcha/api/siteverify?secret=${gSecretKey}& response=${token}`
await axios({
url: captchaURL,
method: 'POST'。
headers: { ContentType: 'application/x-www-form-urlencoded' }。
}).then(response => {
const gVerifyData = response.data
if (gVerifyData.success ==true) {
Users.findOne({ 'email': req.body.email }) 。 select(' hashPassword status').exec(function(err, user) {
if (err) {
return res.status(500).send({ err })。
} else if (user) {
validPassword = bcrypt.compareSync(req.body.password, user.hashPassword) 。
if (! validPassword) {
return res.send("wrong-info"/span>)。
} else if (validPassword && user.status == "active" ) {
token = jwt.sign({ id: user._id }, env.jwtsecret,
{ expiresIn: "168h" })。)
res.status(200).send({ token: token, user }) 。
}
} else {
return res.send("wrong-info"/span>)。
}
}
)
} else {
return res.status(500).send('bot') 。
}
}).catch(error => {
console.log(error)。
});
}
};
問題出在前面,你把它分配給了方法wrapRoute(),該方法回傳一個Promise,而這個Promise并沒有被解決,導致你得到的錯誤。
如果這只是為了在出錯時呼叫 next() ,你總是可以在 catch 塊中使用它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/327643.html
標籤:
上一篇:通過活動傳遞投入
