Node.js 使用multer的FileUpload Api未指定默认引擎,也未提供扩展
我正在尝试创建一个api,用于用户注册和配置文件pic。我使用nodejs并使用multer上传它。当我试图上传imagefile和其他属性,如名字、姓氏、电子邮件等以及url时。我希望图像能够从文件系统浏览,并将其存储在根目录的“uploads”文件夹中。同样在数据库中,我希望只保存图像的url,而不是图像文件。我也写了代码,但当我使用postman测试它时,我在发送请求时出错。我尝试创建其他没有映像的api,它工作得很好,所以我确信数据库连接至少没有问题。我尝试在不同的时间使用fromdata和json发送数据,但对我来说不起作用 app.jsNode.js 使用multer的FileUpload Api未指定默认引擎,也未提供扩展,node.js,multer,Node.js,Multer,我正在尝试创建一个api,用于用户注册和配置文件pic。我使用nodejs并使用multer上传它。当我试图上传imagefile和其他属性,如名字、姓氏、电子邮件等以及url时。我希望图像能够从文件系统浏览,并将其存储在根目录的“uploads”文件夹中。同样在数据库中,我希望只保存图像的url,而不是图像文件。我也写了代码,但当我使用postman测试它时,我在发送请求时出错。我尝试创建其他没有映像的api,它工作得很好,所以我确信数据库连接至少没有问题。我尝试在不同的时间使用fromdat
require("dotenv").config();
const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');
const multer = require('multer');
const userRouter = require('./users/user.router');
const app = express();
const storage = multer.diskStorage({
//cb is callback . will always return error
destination: function(req,file, cb){
cb(null, 'uploads/')
},
filename: function(req, file, cb){
//cb(null, Date.now() + file.originalname)
cb(null, `${file.fieldname}_${Date.now()}${path.extname(file.originalname)}`);
}
});
const fileFilter = (req, file, cb)=>{
//reject a file
if(
file.mimetype === 'image/jpeg' ||
file.mimetype === 'image/png' ||
file.mimetype === 'application/pdf'
){
cb(null, true);
}else{
cb(new Error('Please select png, jpeg or pdf format'), false);
console.log('Not correct file type');
}
};
app.use(
multer({
storage:storage,
limits: {fileSize: 1000000000},
fileFilter: fileFilter
}).single('sellerimage')
);
//define the folder name for the image file to be displayed to public
//app.use('/images', express.static('uploads'));
app.use('/images', express.static(path.join(__dirname,'uploads')));
//app.use(bodyParser.urlencoded()); // x-www-form-urlencoded <form>
//app.use(bodyParser.json()); //application/json
//convert json object to javascript object
app.use(express.json());
app.use('/api/users', userRouter);
// error handler
app.use(function(err, req, res, next) {
//Multer error handler
if(err instanceof multer.MulterError){
res.json({
success: 0,
message: err.message
})
}
//Multer error handler ends
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
app.listen(9999, () => {
console.log("server up and running on 9999");
});
user.controller.js
const {
createUserWithUpload } = require('./user.service.js');
const { genSaltSync, hashSync } = require('bcrypt');
module.exports = {
createUserWithUpload: (req, res) => {
if(!req.file){
const error = new Error("No image provided");
error.statusCode = 422;
throw error;
}
const body = req.body;
body.url = req.file.path;
const salt = genSaltSync(10);
body.password = hashSync(body.password, salt);
create(body, (err, results) => {
if (err) {
console.log(err);
return res.status(500).json({
success: 0,
message: "Database connection error"
});
}
return res.status(200).json({
success: 1,
data: results
});
})
},
}
user.service.js
const pool = require("../db");
module.exports = {
createUserWithUpload: (data, callback) => {
pool.query(
`INSERT INTO registration(firstName, lastName, gender, email, password, number, url) VALUES (?,?,?,?,?,?,?)`,
[
data.first_name,
data.last_name,
data.gender,
data.email,
data.password,
data.number,
data.url
],
(error, results, fields) => {
if (error) {
return callback(error);
}
return callback(null, results);
}
);
},
};
控制台错误:
Error: No default engine was specified and no extension was provided.
at new View (C:\NodeJS JWT\node_modules\express\lib\view.js:61:11)
at Function.render (C:\NodeJS JWT\node_modules\express\lib\application.js:570:12)
at ServerResponse.render (C:\NodeJS JWT\node_modules\express\lib\response.js:1012:7)
at C:\NodeJS JWT\app.js:93:9
at Layer.handle_error (C:\NodeJS JWT\node_modules\express\lib\router\layer.js:71:5)
at trim_prefix (C:\NodeJS JWT\node_modules\express\lib\router\index.js:315:13)
at C:\NodeJS JWT\node_modules\express\lib\router\index.js:284:7
at Function.process_params (C:\NodeJS JWT\node_modules\express\lib\router\index.js:335:12)
at next (C:\NodeJS JWT\node_modules\express\lib\router\index.js:275:10)
at Layer.handle_error (C:\NodeJS JWT\node_modules\express\lib\router\layer.js:67:12)
您在某处出错,express试图返回错误页面
app.use(function(err, req, res, next) {
//Multer error handler
if(err instanceof multer.MulterError){
res.json({
success: 0,
message: err.message
})
}
//Multer error handler ends
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error'); // express trying to render view, but no view engine has been set
});
您得到的错误意味着express无法渲染视图,因为未设置默认引擎。你可以用两种方法来解决这个问题
res.render()
替换为res.json()
,并通过json返回错误消息(如有必要)app设置默认视图引擎。Set('view engine','pug')
——将其设置为要使用的模板引擎您在某处出错,express正在尝试返回错误页
app.use(function(err, req, res, next) {
//Multer error handler
if(err instanceof multer.MulterError){
res.json({
success: 0,
message: err.message
})
}
//Multer error handler ends
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error'); // express trying to render view, but no view engine has been set
});
您得到的错误意味着express无法渲染视图,因为未设置默认引擎。你可以用两种方法来解决这个问题
res.render()
替换为res.json()
,并通过json返回错误消息(如有必要)app设置默认视图引擎。Set('view engine','pug')
——将其设置为要使用的模板引擎这对我来说很有效,但现在又出现了另一个错误,即“意外字段”。我已经在问题中发布了错误图像,我不确定为什么它没有在控制台中记录任何错误。或者可能是我没有进入console.log()的某个位置。你能帮帮我吗。我现在正在控制台中查看下面的内容。你能帮我一下吗?请[nodemon]启动
node app.js
服务器并在9999上运行,这对我来说很有效,但现在又出现了一个错误,即“意外字段”。我已经在问题中发布了错误图像,我不确定为什么它没有在控制台中记录任何错误。或者可能是我没有进入console.log()的某个位置。你能帮帮我吗。我现在正在控制台中查看下面的内容。你能帮我把[nodemon]启动node app.js
服务器并在9999上运行吗