我正试图通过POST请求将一个文件上传到cloudinary并将url保存到mongodb
下面是我的前端代码:
<form action="/add-product?_csrf=<%=csrfToken%>" class="form-control col s12" method="POST" enctype="multipart/form-data">
<div class="row">
<div class="input-field">
<label for="title">Name</label>
<br>
<input type="text" id="name" name="name" required>
</div>
</div>
<div class="row">
<div>
<% if (categories.length > 0) { %>
<label for="category"><h5>Category</h5></label>
<select id="status" name="status">
<% categories.forEach(category => { %>
<option value="category"><%= category.category %></option>
<% }) %>
</select>
<% } else { %>
<p>There are no categories to select</p>
<% } %>
</div>
</div>
<div class="row">
<div class="input-field" id="ckeditor">
<h5>Product Description</h5>
<textarea id="body" name="description"></textarea>
</div>
</div>
<div class="row">
<div class="input-field">
<label for="image"> Upload Product Image</label>
<br>
<br>
<input type="file" name="image">
</div>
</div>
<div class="row">
<div class="input-field">
<label for="price">Price</label>
<br>
<input type="number" id="price" name="price">
</div>
</div>
<div class="row">
<input type="submit" value="Save" class="btn">
<a href="/" class="btn orange">Cancel</a>
</div>
</form>
我在express服务器上的此页路由:
//get the link to add a product to the eccomerce application using a GET request
router.get('/add-product', ensureAuth, csrfProtection, async (req,res) =>{
try {
const categories = await Category.find().sort({createdAt:-1})
//console.log(categories)
res.render('addproduct',{categories:categories,csrfToken:req.csrfToken()})
} catch (err) {
console.error(err)
res.render('error/500')
}
})
//post the filled form
router.post('/add-product',ensureAuth, parseForm, csrfProtection,async (req,res)=>{
try {
// Upload image to cloudinary
console.log(req)
console.log(req.file)
const result = await cloudinary.uploader.upload(req.file.path, function(err,res){
console.error(err);
});
//assert the populate db relationship
req.body.user = req.user.id
let Product = new product({
category: req.body.category,
name: req.body.name,
image: result.secure_url,
description:req.body.description,
price:req.body.price,
})
await Product.save()
res.redirect('/')
} catch (err) {
console.error(err)
res.render('error/500')
}
})
然而,在填写表单字段后试图发布请求时,我得到了错误:
undefined
TypeError: Cannot read property 'path' of undefined
at router.post (/home/e-wave/Desktop/nodecommerce/routes/eroutes.js:131:62)
at Layer.handle [as handle_request] (/home/e-wave/Desktop/nodecommerce/node_modules/express/lib/router/layer.js:95:5)
at next (/home/e-wave/Desktop/nodecommerce/node_modules/express/lib/router/route.js:137:13)
at csrf (/home/e-wave/Desktop/nodecommerce/node_modules/csurf/index.js:117:5)
at Layer.handle [as handle_request] (/home/e-wave/Desktop/nodecommerce/node_modules/express/lib/router/layer.js:95:5)
at next (/home/e-wave/Desktop/nodecommerce/node_modules/express/lib/router/route.js:137:13)
at urlencodedParser (/home/e-wave/Desktop/nodecommerce/node_modules/body-parser/lib/types/urlencoded.js:100:7)
at Layer.handle [as handle_request] (/home/e-wave/Desktop/nodecommerce/node_modules/express/lib/router/layer.js:95:5)
at next (/home/e-wave/Desktop/nodecommerce/node_modules/express/lib/router/route.js:137:13)
at ensureAuth (/home/e-wave/Desktop/nodecommerce/middleware/auth.js:4:20)
at Layer.handle [as handle_request] (/home/e-wave/Desktop/nodecommerce/node_modules/express/lib/router/layer.js:95:5)
at next (/home/e-wave/Desktop/nodecommerce/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/home/e-wave/Desktop/nodecommerce/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/home/e-wave/Desktop/nodecommerce/node_modules/express/lib/router/layer.js:95:5)
at /home/e-wave/Desktop/nodecommerce/node_modules/express/lib/router/index.js:281:22
at Function.process_params (/home/e-wave/Desktop/nodecommerce/node_modules/express/lib/router/index.js:335:12)
const cloudinary = require("cloudinary").v2;
const {cloudStorage} = require('multer-storage-cloudinary');
const dotenv = require('dotenv').config({path:__dirname+'/.env'});
cloudinary.config({
cloud_name: process.env.CLOUD_NAME,
api_key: process.env.API_KEY,
api_secret: process.env.API_SECRET,
});
module.exports = cloudinary
const cloudinary = require("../utils/cloudinary");
问题解决了,显然我没有使用任何中间件(在本例中是multer)来管理上传的文件。
代码段
我必须在utils文件夹中创建一个multer.js文件
const multer = require("multer");
const path = require("path");
// Multer config
module.exports = multer({
storage: multer.diskStorage({}),
fileFilter: (req, file, cb) => {
let ext = path.extname(file.originalname);
if (ext !== ".jpg" && ext !== ".jpeg" && ext !== ".png") {
cb(new Error("File type is not supported"), false);
return;
}
cb(null, true);
},
});
然后在express server文件夹中要求此模块
const upload = require("../utils/multer");
然后在add-product POST请求中作为中间件添加
router.post('/add-product', upload.single("image"),ensureAuth, parseForm, csrfProtection,async (req,res)=>{
try {
// Upload image to cloudinary
const result = await cloudinary.uploader.upload(req.file.path);
//assert the populate db relationship
req.body.user = req.user.id
let Product = new product({
category: req.body.category,
name: req.body.name,
image: result.secure_url,
description:req.body.description,
price:req.body.price,
})
await Product.save()
res.redirect('/')
} catch (err) {
console.error(err)
res.render('error/500')
}
})
我有这个错误 TypeError[ERR_INVALID_ARG_TYPE]:“chunk”参数必须是string类型或Buffer实例。接收到Object的实例 但我不知道怎么解决: 下面是我的代码库: 谢谢任何帮助我解决这个问题的人
我想上传文件并保存到特定的目录。而且我对文件的概念是陌生的。当我从我的页面上传文件时,它们保存在另一个目录(C:\ Users \ ROOTCP ~ 1 \ AppData \ Local \ Temp \ multipartbody 989135345617811478 astemporary file)而不是指定的目录。我不能设置它。请帮我找到解决办法。提前感谢所有的帮助。 上传的文件为什么保
TypeError:无法读取app.post(/var/www/html/express/simplecrud/server.js:20:21)层未定义的属性“collection”。处理[as handle_request](/var/www/html/express/simplecrud/node_modules/express/lib/router/layer.js:95:5)层的下一个(/
问题内容: 我正在按照本教程进行操作,并且在 将值从一个组件的状态传递到另一个组件 时遇到了一个问题。 当执行组件中的功能时,将引发错误。 什么会导致的是从路过的时候到? 问题答案: 首先,设置更安全的初始数据: 并确保您的ajax数据。 如果您按照上面的两个指示(如“ 演示”)操作,它应该可以工作。 更新:您可以仅使用条件语句包装.map块。
我正在编写一个应用程序,它从url下载图像,然后使用AWS-SDK将其上传到S3桶中。 以前,我只是下载图像并将它们保存到磁盘上,就像这样。 然后像这样将图像上传到AWS S3 但我想跳过将映像保存到磁盘的部分。有什么方法可以响应从到一个变量,然后上传它吗?
问题内容: 是否可以将JSON数据保存到本地文本文件中?因此,稍后我可以通过加载该文件再次使用它,并取回存储的JSON数据。其实我真正想做的是在文本文件中导出JSON数据,以便以后可以用作import.Any的建议或解决方案? 这是我要用于导出到文本的一些示例。 http://jsfiddle.net/k56eezxp/ 问题答案: 是否可以将JSON数据保存到本地文本文件中? 是。当前,链接的j