node.js - 与路由中的回调作斗争 - NodeJS
问题描述
在我的 nodejs 后端中,我有一条删除产品的路线。因为用户可以上传与产品相关的图片,所以相应的图片也需要删除。但我正在努力做到这一点。
我的节点:
productRoutes.route('/delete/:id').get(function (req, res) {
const id = req.params.id;
Product.find({_id: id}).select('name').exec().then(product => {
var name = product[0].name;
rimraf('uploads/imgs/' + name, function () {
console.log('uploads/imgs/' + name + ' deleted');
});
});
Product.remove({_id: id})
.exec()
.then(result => {
res.status(200).json(result);
})
.catch(err => {
res.status(500).json({
error: err
});
});
});
我首先搜索必须删除的产品名称。然后我用 rimraf 删除它的文件夹。
然后必须删除该产品。现在我知道我做错了,因为 NodeJS 的异步性。由于 NodeJS 是异步工作的,所以会出现 name 变量未定义的错误。
但我真的很难以正确的方式做到这一点。你们能帮忙吗?
解决方案
如果您使用findOneAndRemove
将文档查找和删除合并到一个步骤中的方法,这会更容易:
productRoutes.route('/delete/:id').get(function (req, res) {
const id = req.params.id;
Product.findOneAndRemove({_id: id}, {select: 'name'}, (err, doc, result) => {
if (err) {
res.status(500).json({
error: err
});
}
else if (doc) {
rimraf('uploads/imgs/'+ name, function(){
console.log('uploads/imgs/'+name + ' deleted');
res.status(200).json(result);
});
}
else {
// Don't forget to handle the "id not found" case
res.send(404);
}
});
});
推荐阅读
- firefox-addon - Thunderbird 67 扩展不会在主选项卡中注入内容脚本
- php - PHP 文件上传错误 (UPLOAD_ERR_PARTIAL) / $_FILES 为空或有空“tmp_name”
- java - 我的美元符号在 Android Studio 上不起作用?
- scikit-learn - fit() 缺少 1 个必需的位置参数:'self'
- python - 如何使用 pybind11 将 python tf.Tensor 转换为 C++ Tensor
- json - 在序列化 JSON 的末尾获取一个 INT
- c - 在索引 n 处用 m 次数据填充没有位域的数组
- raspberry-pi3 - 为什么我的树莓派 3 型号 b 会发疯?
- r - 用 R 中的 NA 替换数据框中的 -Inf
- flutter - 找到 androidManifest 扑腾