req.file 未为带有 express 的 multer 和 body-parser 定义 API
req.file undefined for multer and body-parser with express API
我正在编写一个 API,它必须处理上传文件以及其他 GET、POST 请求。我尝试使用 multer
处理文件上传,并使用 body-parser
处理任何其他 HTTP 请求。对于任何上传,我喜欢使用将利用 multer 的端点“/api/upload”,而任何其他 API 调用将使用 api.js
中定义的路由,这也是“/[=54” =]' 但对于许多其他功能。这是设置服务器和路由的 server.js
文件的一部分:
const express = require('express');
const bodyParser = require('body-parser');
const http = require( 'http' );
const path = require( 'path' );
const multer = require( 'multer' );
const upload = multer( { dest : '/uploads' } );
// create express app
const app = express();
// parse requests of content-type - application/x-www-form-urlencoded
app.use( bodyParser.urlencoded( { extended: true } ) );
// parse requests of content-type - application/json
app.use( bodyParser.json() );
...
const api_uploads = require( './server/routes/upload' );
app.use( '/api/upload', api_uploads );
// get API routes
const api = require( './server/routes/api' );
// set our api routes
app.use( '/api', api );
// catch all other routes and return the index file
app.get( '*', ( req, res ) =>
{
res.sendFile( path.join( __dirname, 'dist/index.html' ) );
});
...
我将所有路线存储在两个不同的文件中:upload.js
和 api.js
。 api.js
将容纳所有可以使用 body-parser
作为请求正文的相关函数,而 upload.js
将使用 multer
处理任何文件上传。
这是我的 api.js
文件:
const express = require('express');
const router = express.Router();
const entities = require( '../controllers/entity.controller.js' );
// default api listing
router.get('/', function(req, res)
{
res.send('api works');
});
// Retrieve all Entities
router.get( '/', entities.findAll );
// Create a new Entity
router.post( '/', entities.create );
// search for entities
router.get( '/search', entities.find );
// download all available entities
router.get( '/download', entities.downloadAll );
// download specific entities
router.post( '/download', entities.download );
// Delete an Entity with entityId
router.delete( '/:entityId', entities.delete );
module.exports = router;
和我的 upload.js
文件:
const express = require( 'express' );
const router = express.Router();
const entities = require( '../controllers/entity.controller.js' );
router.post( '/', entities.upload );
module.exports = router;
控制器 entity.controller.js
包含所有 API 函数来处理这些调用。
var Entity = require( '../models/entity.model.js' );
const multer = require( 'multer' );
const upload = multer( { dest : '/uploads' } );
exports.findAll = function( req, res )
{
....
};
exports.create = function( req, res )
{
....
};
exports.find = function( req, res )
{
....
}
exports.downloadAll = function( req, res )
{
....
}
exports.download = function( req, res)
{
....
}
exports.upload = ( upload.single( 'entity' ), function( req, res )
{
if( req.file )
{
console.log( 'file send successfully' );
res.send( { message : 'thank you for the file' } );
}
else
{
res.status( 500 ).send( { message: "Some error occurred while acquiring file." } );
}
});
exports.delete = function( req, res )
{
....
};
我正在尝试通过 Postman 执行 POST 请求来测试我的 API。这是我发送的请求的快照:
但是,每次我检查 exports.upload
内部的 req.file
时,它总是 returns undefined
。我在 Whosebug 上看过其他帖子,但他们似乎主要坚持使用一个中间件来解析传入的请求,我喜欢对某些请求使用 body-parser
,对其他涉及文件上传的请求使用 multer
.这可能吗,根据我当前的设置,我可能做错了什么?此外,如果这是令人费解且不必要的,并且如果坚持使用一个解析器会更好,那么在两者之间切换也可以。
谢谢!
您需要像这样修改代码才能工作:
server.js
app.use( '/api/upload', upload.single('entity'), api_uploads );
entity.controller.js
exports.upload = function (req, res) {
if (req.file) {
console.log('file send successfully');
res.send({
message: 'thank you for the file'
});
} else {
res.status(500).send({
message: "Some error occurred while acquiring file."
});
}
};
我正在编写一个 API,它必须处理上传文件以及其他 GET、POST 请求。我尝试使用 multer
处理文件上传,并使用 body-parser
处理任何其他 HTTP 请求。对于任何上传,我喜欢使用将利用 multer 的端点“/api/upload”,而任何其他 API 调用将使用 api.js
中定义的路由,这也是“/[=54” =]' 但对于许多其他功能。这是设置服务器和路由的 server.js
文件的一部分:
const express = require('express');
const bodyParser = require('body-parser');
const http = require( 'http' );
const path = require( 'path' );
const multer = require( 'multer' );
const upload = multer( { dest : '/uploads' } );
// create express app
const app = express();
// parse requests of content-type - application/x-www-form-urlencoded
app.use( bodyParser.urlencoded( { extended: true } ) );
// parse requests of content-type - application/json
app.use( bodyParser.json() );
...
const api_uploads = require( './server/routes/upload' );
app.use( '/api/upload', api_uploads );
// get API routes
const api = require( './server/routes/api' );
// set our api routes
app.use( '/api', api );
// catch all other routes and return the index file
app.get( '*', ( req, res ) =>
{
res.sendFile( path.join( __dirname, 'dist/index.html' ) );
});
...
我将所有路线存储在两个不同的文件中:upload.js
和 api.js
。 api.js
将容纳所有可以使用 body-parser
作为请求正文的相关函数,而 upload.js
将使用 multer
处理任何文件上传。
这是我的 api.js
文件:
const express = require('express');
const router = express.Router();
const entities = require( '../controllers/entity.controller.js' );
// default api listing
router.get('/', function(req, res)
{
res.send('api works');
});
// Retrieve all Entities
router.get( '/', entities.findAll );
// Create a new Entity
router.post( '/', entities.create );
// search for entities
router.get( '/search', entities.find );
// download all available entities
router.get( '/download', entities.downloadAll );
// download specific entities
router.post( '/download', entities.download );
// Delete an Entity with entityId
router.delete( '/:entityId', entities.delete );
module.exports = router;
和我的 upload.js
文件:
const express = require( 'express' );
const router = express.Router();
const entities = require( '../controllers/entity.controller.js' );
router.post( '/', entities.upload );
module.exports = router;
控制器 entity.controller.js
包含所有 API 函数来处理这些调用。
var Entity = require( '../models/entity.model.js' );
const multer = require( 'multer' );
const upload = multer( { dest : '/uploads' } );
exports.findAll = function( req, res )
{
....
};
exports.create = function( req, res )
{
....
};
exports.find = function( req, res )
{
....
}
exports.downloadAll = function( req, res )
{
....
}
exports.download = function( req, res)
{
....
}
exports.upload = ( upload.single( 'entity' ), function( req, res )
{
if( req.file )
{
console.log( 'file send successfully' );
res.send( { message : 'thank you for the file' } );
}
else
{
res.status( 500 ).send( { message: "Some error occurred while acquiring file." } );
}
});
exports.delete = function( req, res )
{
....
};
我正在尝试通过 Postman 执行 POST 请求来测试我的 API。这是我发送的请求的快照:
但是,每次我检查 exports.upload
内部的 req.file
时,它总是 returns undefined
。我在 Whosebug 上看过其他帖子,但他们似乎主要坚持使用一个中间件来解析传入的请求,我喜欢对某些请求使用 body-parser
,对其他涉及文件上传的请求使用 multer
.这可能吗,根据我当前的设置,我可能做错了什么?此外,如果这是令人费解且不必要的,并且如果坚持使用一个解析器会更好,那么在两者之间切换也可以。
谢谢!
您需要像这样修改代码才能工作:
server.js
app.use( '/api/upload', upload.single('entity'), api_uploads );
entity.controller.js
exports.upload = function (req, res) {
if (req.file) {
console.log('file send successfully');
res.send({
message: 'thank you for the file'
});
} else {
res.status(500).send({
message: "Some error occurred while acquiring file."
});
}
};