我正在做一个函数,允许我在express api(nodejs)中上传图片到imgur,当我调用一个返回承诺的函数时,我遇到了一个错误:
TypeError:res. status不是uploadpicture上的函数。则
这是我的代码:出现错误时:
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);
});
和功能:
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())
});
});
}
代码工作完美,但我不知道为什么突然发生这个错误,我试图:
- 将箭头函数更改为function(){}**添加到路由参数旁边
什么都没起作用,谢谢你的帮助
5条答案
按热度按时间pxy2qtax1#
公认的答案直接解决了OP的问题,但我发布了另一个解决方案,因为您也可以在其他地方遇到这个错误。
当您有:
因为错误处理路由 * 必须 * 接受express的4个参数才能将其标识为错误中间件。
只需添加下一个函数(或任何缺少的参数)就可以修复它。
https://github.com/visionmedia/supertest/issues/416#issuecomment-514508137
ryhaxcpt2#
此时:
res
是promiseuploadpicture
函数(即parsedBody
)的结果,而不是来自快速路由的res
。因此,它确实没有status
函数。请尝试将then
回调名称更改为:ldioqlga3#
您将收到此错误:
TypeError:资源状态不是函数
由于顺序应为
(err, res, req, next)
而非(req, res, err, next)
,因此示例如下zpqajqem4#
参数的顺序真的很重要,我在下面的代码中有错误
我没有把req作为参数,这就是错误的原因,我只是添加req、res,它就工作了
1cosmwyk5#
如果使用的是async/await方法:
**确保包含return语句。**不包含return语句将导致此问题。我所做的其他事情是使用
JSON
而不是json
,这肯定会引发错误。