在restify中使用formidable有问题(Nodejs)

在restify中使用formidable有问题(Nodejs)

不知道大家有没有遇到过,在restify里,formidable无法解析上传的文件 var form = new formidable.IncomingForm(); form.uploadDir = “./tmp” form.parse(req, function (err, fields, files) { res.writeHead(200, {‘content-type’: ‘text/plain’}); res.write(‘received upload:\n\n’); res.end(util.inspect({fields: fields, files: files.upload})); }); 但是form怎么样都不会调用回调函数。 哪位知道在restify里,怎么将上传的文件保存到mongodb中?


2 回复

在使用 restify 框架时,如果你遇到了 formidable 无法正常解析上传文件的问题,这可能是由于 restify 的请求处理机制与 formidable 不兼容导致的。下面是一个解决方案,通过自定义中间件来处理文件上传,并将其保存到 MongoDB 中。

解决方案

首先,确保你已经安装了必要的依赖包:

npm install restify formidable mongodb

然后,你可以创建一个中间件来处理文件上传,并使用 multer 来简化文件处理逻辑。multer 是一个专门为 Node.js 设计的中间件,用于处理 multipart/form-data,主要用于上传文件。

示例代码

  1. 安装 multer 和其他依赖
npm install multer
  1. 创建服务器并配置中间件
const restify = require('restify');
const MongoClient = require('mongodb').MongoClient;
const multer = require('multer');
const path = require('path');

// 创建 Multer 实例
const storage = multer.memoryStorage(); // 存储为内存中的缓冲区
const upload = multer({ storage });

// 连接到 MongoDB
const uri = "mongodb://localhost:27017";
const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });

client.connect(err => {
    if (err) throw err;
    console.log("Connected to MongoDB");

    const db = client.db("your_database_name");
    const collection = db.collection("uploads");

    const server = restify.createServer();

    // 使用 Multer 中间件
    server.use(restify.plugins.bodyParser());
    server.post('/upload', upload.single('file'), (req, res, next) => {
        const file = req.file;

        // 将文件保存到 MongoDB
        collection.insertOne({
            filename: file.originalname,
            contentType: file.mimetype,
            data: file.buffer
        }, (err, result) => {
            if (err) {
                res.send(500, { error: 'Failed to save file' });
                return next(err);
            }
            res.send(200, { message: 'File uploaded successfully' });
            next();
        });
    });

    server.listen(8080, () => {
        console.log('%s listening at %s', server.name, server.url);
    });
});

解释

  • Multer 配置:我们使用 multer 来处理文件上传。storage 设置为 memoryStorage,这意味着文件将存储在内存中的缓冲区中。
  • MongoDB 连接:我们使用 MongoClient 连接到本地 MongoDB 实例。
  • Restify 路由:我们创建了一个 POST 路由 /upload,并在其中使用 upload.single('file') 中间件来处理单个文件上传。
  • 文件保存:文件被保存到 MongoDB 中的一个集合 uploads 中。文件的元数据(如文件名、内容类型和二进制数据)被插入到数据库中。

这样,你就可以在 restify 中处理文件上传,并将文件保存到 MongoDB 中。


restify 中使用 formidable 解析上传的文件时遇到问题,通常是因为请求处理方式的不同。restify 的请求处理机制与普通的 http 服务器有所不同,因此需要做一些调整以确保 formidable 能正确工作。

示例代码

首先,你需要安装必要的包:

npm install restify formidable

然后,你可以尝试以下代码:

const restify = require('restify');
const formidable = require('formidable');

const server = restify.createServer();

server.post('/upload', (req, res, next) => {
    const form = new formidable.IncomingForm();
    form.uploadDir = "./tmp";

    form.parse(req, (err, fields, files) => {
        if (err) {
            console.error("Error parsing the form:", err);
            res.writeHead(500, {'Content-Type': 'text/plain'});
            res.end('Internal Server Error');
            return next(err);
        }

        res.writeHead(200, {'Content-Type': 'text/plain'});
        res.write('Received upload:\n\n');
        res.end(JSON.stringify({fields: fields, files: files}, null, 2));

        // 这里可以添加代码将文件保存到 MongoDB
        // 例如使用 mongoose 将文件信息保存到数据库
    });

    return next();
});

server.listen(3000, () => {
    console.log('%s listening at %s', server.name, server.url);
});

解释

  1. 安装必要的包:确保你已经安装了 restifyformidable
  2. 创建服务器:使用 restify.createServer() 创建一个服务器实例。
  3. 定义路由处理:定义一个 POST 路由 /upload,并设置相应的回调函数。
  4. 创建 formidable 表单:在回调函数中创建一个新的 IncomingForm 实例,并设置上传目录。
  5. 解析请求:调用 form.parse(req, callback) 来解析上传的表单数据。
  6. 处理错误:在回调函数中检查是否有错误发生,如果有则返回错误信息。
  7. 发送响应:向客户端发送响应,并输出解析后的字段和文件信息。
  8. 存储到 MongoDB:在注释中提到如何将文件信息保存到 MongoDB,可以通过 Mongoose 等库实现。

通过上述步骤,你应该能够解决在 restify 中使用 formidable 解析文件上传的问题。

回到顶部