Unhandled Promise rejection warning: TypeError: First argument must be a string or Buffer
Unhandled Promise rejection warning: TypeError: First argument must be a string or Buffer
问题似乎是重复的,但我从过去 3 小时开始就一直在努力解决这个问题。基本上我使用 supertest
& mocha
来测试我的 API。
我无法理解哪个承诺没有得到解决。
app.post('/todos', (req, res) => {
var todo = new Todo({
text : req.body.text
});
todo.save().then( (doc) => {
res.status(200).send(doc)
}, (e) => {
res.status(400).end(e);
});
});
以下是我写的测试:
const expect = require('expect');
const request = require('supertest');
var {app} = require('./../server');
var {Todo} = require('./../models/todo');
// Setup database
beforeEach((done) => {
Todo.remove({})
.then(() => done())
.catch((e)=> done(e));
});
describe('Post /todos', () => {
it('should create a new todo', (done) => {
var text = 'Testing text';
// supertest to get, post
request(app)
.post('/todos')
.send({text}) // Automatic conversion to json - ES6
.expect(200) // assertions
.expect((res) => { // custom parsing
expect(res.body.text).toBe(text);
})
.end((err, res) => { // done directly accepted, but rather let's be more precise now - check mongodb
if (err) {
return done(err);
}
Todo.find()
.then((todos) => {
expect(todos.length).toBe(1);
expect(todos[0].text).toBe(text);
done();
})
.catch((e) => done(e));
});
});
});
请帮忙解决这个问题。
这是整个错误信息:
mocha server/**/*.test.js
Listening on port: 3000
Post /todos
(node:1882) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: First argument must be a string or Buffer
(node:1882) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
1) should create a new todo
0 passing (2s)
1 failing
1) Post /todos should create a new todo:
Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.
express 中的 end
函数只接受字符串或缓冲区,不接受对象(参见 https://expressjs.com/en/api.html#res.end and https://nodejs.org/api/http.html#http_response_end_data_encoding_callback)。
但是,看起来 todo.save()
使用对象调用 reject
,这意味着 e
导致了 TypeError
。因为这是捕获承诺拒绝的错误,所以该错误包含在 Unhandled Promise Rejection
警告中。
假设 e
是 { message: "First argument must be a string or Buffer" }
,新代码可以是:
todo.save().then( (doc) => {
res.status(200).send(doc)
}, (e) => {
res.status(400).end(e.message);
});
todo.save()
承诺被拒绝的原因可能是因为待办事项中的 text
似乎未定义。这是分配给 req
的 JSON:
{
text: 'Testing text'
}
不过,应该是这样的:
{
body: {
text: 'Testing text'
}
}
如果您将发送更改为:
,则应修复测试
.send({ body: { text }) // Automatic conversion to json - ES6
问题似乎是重复的,但我从过去 3 小时开始就一直在努力解决这个问题。基本上我使用 supertest
& mocha
来测试我的 API。
我无法理解哪个承诺没有得到解决。
app.post('/todos', (req, res) => {
var todo = new Todo({
text : req.body.text
});
todo.save().then( (doc) => {
res.status(200).send(doc)
}, (e) => {
res.status(400).end(e);
});
});
以下是我写的测试:
const expect = require('expect');
const request = require('supertest');
var {app} = require('./../server');
var {Todo} = require('./../models/todo');
// Setup database
beforeEach((done) => {
Todo.remove({})
.then(() => done())
.catch((e)=> done(e));
});
describe('Post /todos', () => {
it('should create a new todo', (done) => {
var text = 'Testing text';
// supertest to get, post
request(app)
.post('/todos')
.send({text}) // Automatic conversion to json - ES6
.expect(200) // assertions
.expect((res) => { // custom parsing
expect(res.body.text).toBe(text);
})
.end((err, res) => { // done directly accepted, but rather let's be more precise now - check mongodb
if (err) {
return done(err);
}
Todo.find()
.then((todos) => {
expect(todos.length).toBe(1);
expect(todos[0].text).toBe(text);
done();
})
.catch((e) => done(e));
});
});
});
请帮忙解决这个问题。 这是整个错误信息:
mocha server/**/*.test.js Listening on port: 3000 Post /todos (node:1882) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: First argument must be a string or Buffer (node:1882) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code. 1) should create a new todo 0 passing (2s) 1 failing 1) Post /todos should create a new todo: Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.
express 中的 end
函数只接受字符串或缓冲区,不接受对象(参见 https://expressjs.com/en/api.html#res.end and https://nodejs.org/api/http.html#http_response_end_data_encoding_callback)。
但是,看起来 todo.save()
使用对象调用 reject
,这意味着 e
导致了 TypeError
。因为这是捕获承诺拒绝的错误,所以该错误包含在 Unhandled Promise Rejection
警告中。
假设 e
是 { message: "First argument must be a string or Buffer" }
,新代码可以是:
todo.save().then( (doc) => {
res.status(200).send(doc)
}, (e) => {
res.status(400).end(e.message);
});
todo.save()
承诺被拒绝的原因可能是因为待办事项中的 text
似乎未定义。这是分配给 req
的 JSON:
{
text: 'Testing text'
}
不过,应该是这样的:
{
body: {
text: 'Testing text'
}
}
如果您将发送更改为:
,则应修复测试.send({ body: { text }) // Automatic conversion to json - ES6