【发布时间】:2020-10-24 17:29:32
【问题描述】:
我正在尝试创建一个用于用户注册的 api 以及个人资料图片。我正在使用 nodejs 并使用 multer 上传它。当我尝试上传图像文件以及其他属性(例如名字、姓氏、电子邮件等)以及 url 时。我希望图像能够从文件系统浏览并将其存储在根目录的“上传”文件夹中。同样在数据库中,我希望只保存图像的 url 而不是图像文件。我也编写了代码,但是当我使用邮递员对其进行测试时,发送请求时出现错误。我尝试在没有图像的情况下创建其他 api,它工作正常,所以我确信数据库连接至少没有问题。我尝试在不同时间同时使用 from data 和 json 发送,但对我没有用。
app.js
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.Router.js
const {
createUserWithUpload,
} = require("./user.controller");
const express = require("express");
const router = express.Router();
router.post("/upload", createUserWithUpload);
module.exports = router;
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)
【问题讨论】: