代码之家  ›  专栏  ›  技术社区  ›  ans

需求。使用express API的multer和body解析器的文件未定义

  •  0
  • ans  · 技术社区  · 6 年前

    我正在编写一个API,它必须处理上传文件以及其他GET、POST请求。我正在尝试使用处理文件上载 multer ,并使用 body-parser 对于任何其他HTTP请求。对于任何上载,我喜欢使用端点“/api/upload”,它将利用multer,任何其他api调用都将使用中定义的路由 api.js ,它也是“/api”,但用于许多其他函数。这是我的 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公司 将包含可以使用 正文分析器 对于请求正文,而 上载js公司 将使用 穆特 处理任何文件上载。

    这是我的 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;
    

    还有我的 上载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。以下是正在发送的请求的快照: postman POST request

    然而,每次我检查 req.file 的内部 exports.upload 它总是回来 undefined 。我看过其他关于stackoverflow的帖子,但他们似乎大多坚持使用一个中间件来解析传入的请求,我喜欢在其中使用 正文分析器 对于某些请求和 穆特 对于其他涉及文件上载的。这可能吗?根据我当前的设置,我可能做错了什么?同样,如果这是复杂且不必要的,如果坚持使用一个解析器会更好,那么在两个解析器之间也可以。

    谢谢

    1 回复  |  直到 6 年前
        1
  •  0
  •   kgangadhar    6 年前

    您需要像这样修改代码才能工作:

    服务器js公司

    app.use( '/api/upload', upload.single('entity'), api_uploads );
    

    实体控制器。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."
            });
        }
    };