non*_*oom 10 javascript api node.js promise express
我正在制作一个允许我在我的 express api(nodejs)中将图片上传到 imgur 的函数,在调用返回承诺的函数时遇到错误:
类型错误:res.status 不是 uploadpicture.then 的函数
这是我的代码: 引发错误的地方:
router.post('/upload', (req, res, next)=> {
var busboy = new Busboy({headers: req.headers});
busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
if(fieldname == 'image') {
// the buffer
file.fileRead = [];
file.on('data', function(data) {
// add to the buffer as data comes in
this.fileRead.push(data);
});
file.on('end', function() {
// create a new stream with our buffered data
var finalBuffer = Buffer.concat(this.fileRead);
upload = uploadpicture(finalBuffer).then((res)=>{ //success request
console.log(res);
res.status(200).json({success: true, message: "Successfully uploaded !", url: res.data.link});
},(err)=>{ //error
res.status(500).json({success: false, message: "Error happenned while uploading !"});
}).catch((error)=>{
console.log(error);
res.status(500).json({success: false, message: "Error happenned while uploading !"});
});
})
}
});
busboy.on('finish', function() {
//busboy finished
});
req.pipe(busboy);
});
Run Code Online (Sandbox Code Playgroud)
和功能:
function uploadpicture(stream){ //get picture stream
return new Promise((resolve, reject)=>{
var options = {
uri: 'https://api.imgur.com/3/image',
method: 'POST',
headers: {
//'Authorization': 'Client-ID ' + config.client_id_imgur // put client id here
},
formData: {
image: stream,
type: 'file'
},
auth: {
bearer: config.access_token_imgur,
}
};
request(options)
.then((parsedBody)=> {
resolve(parsedBody);
})
.catch((err)=> {
console.log(err);
reject(err.toString())
});
});
}
Run Code Online (Sandbox Code Playgroud)
该代码运行良好,但我不知道为什么会突然发生此错误,我尝试:
将箭头函数更改为 function(){} 在路由参数旁边添加
没有任何效果,感谢您的帮助
小智 36
接受的答案直接解决了OP的问题,但我发布了另一个解决方案,因为您也可能在其他地方遇到此错误。
当你有:
api.use((error: ErrorRequestHandler, request: ExpressRequest, response: ExpressResponse) => {
response.status(500).end() // response.status is not a function
})
Run Code Online (Sandbox Code Playgroud)
因为错误处理路由必须接受 Express 的 4 个参数才能将其标识为错误中间件。
api.use((error: ErrorRequestHandler, request: ExpressRequest, response: ExpressResponse, next: NextFunction) => {
response.status(500).end()
})
Run Code Online (Sandbox Code Playgroud)
只需添加下一个函数(或您缺少的任何参数)即可修复它。
https://github.com/visionmedia/supertest/issues/416#issuecomment-514508137
小智 12
这一点:
upload = uploadpicture(finalBuffer).then((res)=>{ //success request
Run Code Online (Sandbox Code Playgroud)
theres是 promiseuploadpicture函数的结果(即parsedBody),而不是res来自 express 路由的结果。所以确实,它没有任何status功能。尝试更改then回调名称,如:
upload = uploadpicture(finalBuffer).then((otherName)=>{ //success request
Run Code Online (Sandbox Code Playgroud)
小智 6
您收到此错误:
类型错误:res.status 不是函数
因为顺序(err, req, res, next)不应该(req, res, err, next),下面的例子
const errorHandler = (err, req, res, next) => {
const statusCode = res.statusCode === 200 ? 500 : res.statusCode;
res.status(statusCode)
res.json({
message : err.message,
stack :process.env.NODE_ENV === 'production' ? null : err.stack,
})
}
Run Code Online (Sandbox Code Playgroud)