javascript - 不推荐使用 Node/Express 未处理的承诺拒绝
问题描述
我一直在尝试解决这些在我的代码中继续出现的未处理的 Promise 拒绝。
我目前得到的如下:
[nodemon] 开始
mocha --recursive -R min
(节点:35286)UnhandledPromiseRejectionWarning:AssertionError [ERR_ASSERTION]:表达式评估为虚假值:断言(计数 + 1 === 新计数)
at Driver.count.then.newCount (/Users/danale/Projects/muber/test/controllers/drivers_controller.test.js:16:13) at processTicksAndRejections (internal/process/next_tick.js:81:5) (node:35286) UnhandledPromiseRejectionWarning: Unhandled promise
拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。(拒绝 id:1)(节点:35286)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。
应该通过的测试是这个:
const assert = require("assert");
const request = require("supertest");
const mongoose = require("mongoose");
const app = require("../../app");
const Driver = mongoose.model("driver");
describe("Drivers controller", () => {
it("Post to /api/drivers create a new driver", done => {
Driver.count().then(count => {
request(app)
.post("api/drivers")
.send({ email: "test@test.com" })
.end(() => {
Driver.count().then(newCount => {
assert(count + 1 === newCount);
done();
});
});
});
});
});
为了处理我之前收到的 Promise 拒绝,我这样做了:
const express = require("express");
const bodyParser = require("body-parser");
const mongoose = require("mongoose");
const routes = require("./routes/routes");
const app = express();
mongoose.Promise = global.Promise;
mongoose.connect("mongodb://localhost/muber", { useMongoClient: true });
app.use(bodyParser.json());
routes(app);
module.exports = app;
我要测试的控制器是:
const Driver = require("../models/driver");
module.exports = {
greeting(req, res) {
res.send({ hi: "there" });
},
create(req, res) {
console.log(req.body);
const driverProps = req.body;
Driver.create(driverProps).then(driver => res.send(driver));
}
};
我确实尝试catch()
像这样添加到测试中:
describe("Drivers controller", () => {
it("Post to /api/drivers create a new driver", done => {
Driver.count()
.then(count => {
request(app)
.post("api/drivers")
.send({ email: "test@test.com" })
.end((err, res) => {
Driver.count().then(newCount => {
assert(count + 1 === newCount);
done();
});
});
})
.catch(error => console.log(error));
});
});
但它没有解决错误。
这是我的路线处理程序:
const DriversController = require("../controllers/drivers_controller");
module.exports = app => {
// Watch for incoming requests of method GET to the route http://localhost:3050/api
app.get("/api", DriversController.greeting);
app.post("/api/drivers", DriversController.create);
};
解决方案
我可能是错的,但是您在进行比较和计算时没有先进行 count + 1。可以解决的问题是:
assert((count + 1) === newCount)
因此,在上面的示例中,您将计算与比较值分开。
请参阅下面对此的评论
推荐阅读
- scala - 像 Eithers 这样的错误处理单子如何实现引用透明性?
- javascript - 如何改变滚动位置?
- reactjs - 如何将 react-phone-number-input 添加到-react-final-form?
- python - Django:具有完全相同角色的属性和查询集的干代码?
- gradle - 如何在 kotlin+gradle 项目中执行架构规则?
- javascript - 冻结 Sharepoint 列表视图的第一列
- hotswapagent - Hotswapper 插件不会重新加载 Web 项目中的类
- css - 将父 div 水平居中对齐
- data-structures - Python中的快速数据结构,用于将一堆图像索引为重复项
- c# - 如何修复 (29,20):错误 CS1519:类、结构或接口成员声明中的标记“}”无效