最近测试小程序的接口,需要我提供一个后端服务的文件上传接口。可以使用 Node.js 创建一个这样的上传文件的接口。主要会用到 Express,Multer 这两个 Package。另外可以把上传的结果存储在数据库里,我用了一个叫 Loki 的数据库,这个数据库会在内存里运行,使用简单,速度快。
准备项目
为项目准备一个 package.json 文件。
npm init -y
安装包
npm install express multer cors --save
express 用来创建接口,multer 可以处理文件的上传,cors 可以方便的解决跨域请求问题,比如你的前端应用或者小程序要请求后端服务接口,就会有跨域问题,你得设置一些头部信息解决这个问题。
再安装一个开发依赖叫 nodemon,它会帮我们重启服务。
npm install nodemon --save-dev
文件上传
在项目下面创建一个 upload.js,可以放在 src 目录的下面。内容如下:
src/upload.js
const multer = require('multer') const fileFilter = (request, file, callback) => { if (!file.originalname.match(/\.(jpg|jpeg|png|gif|mp3|mp4)$/)) { return callback(new Error('wrong type :)'), false) } callback(null, true) } const upload = multer({ dest: 'uploads/', fileFilter }) module.exports = { upload }
fileFilter 是个文件上传过滤器。upload 是创建的这个上传, dest 设置了文件上传的位置。
数据库
我们可以把文件上传的结果存储在数据库。创建一个 db.js,放在 src 目录的下面。
src/db.js
const loki = require('lokijs') const loadCollection = (collectionName, db) => { return new Promise(resolve => { db.loadDatabase({}, () => { const collection = db.getCollection(collectionName) || db.addCollection(collectionName) resolve(collection) }) }) } const db = new loki('uploads/uploads.json', { persistenceMethod: 'fs' }) module.exports = { loadCollection, db }
loadCollection 可以为我们创建或者获取到数据库里指定的集合。db 是我们创建的数据库,它会存储在 uploads 目录的下面,名字是 uploads.json 。
接口与服务
在项目根目录下面,创建一个 index.js ,里面可以创建应用与接口。
const express = require('express') const cors = require('cors') const { loadCollection, db } = require('./db') const { upload } = require('./upload') const app = express() const router = express.Router() app.use(cors()) router.route('/uploads') .post(upload.array('uploads', 9), async (request, response, next) => { const collection = await loadCollection('uploads', db) const result = collection.insert(request.files) db.saveDatabase() response.send( result ) }) app.use('/api', router) app.listen(8080, () => { console.log('localhost:8080') })
上面创建了一个 /uploads 接口,用 POST 方法请求 /api/uploads 的时候会用它来处理。里面的 upload.array 可以处理多个文件的上传,9 是设置的一次最大可以上传的文件数量。
package.json
打开 package.json,在 script 里面,添加一条脚本:
"scripts": { "start": "./node_modules/.bin/nodemon index.js" },
启动
在命令行下面,执行:
npm start
测试
找一个 REST 客户端,比如 Postman 或者 Insomnia ,配置一个请求,方法是 POST,地址是 localhost:8080/api/uploads,添加一个请求主体,类型是 Multipart Form,添加一个元素,名字应该是 uploads ,类型是 file,选择一个文件,然后发送一下这个请求。会返回上传以后存储在数据库里的结果。在项目的 uploads 目录下面,你可以找到刚才上传的文件。
Node.js订阅宁皓网,学习更多 Node.js 相关课程。
评论
哇塞,搞得我又想续费了 🍻
7 年 3 个月 以前
浩哥, 在 index.js 中
const { loadCollection, db } = require('./src/db')
const { upload } = require('./src/upload')
而且 async await 低版本的node用不了
7 年 3 个月 以前
必须 Node v8 才支持
7 年 3 个月 以前
Typescript 应该能行。
7 年 2 个月 以前
有没有上传到mongodb的呀?比如GridFS之类的。谢啦 皓哥
6 年 7 个月 以前
还没有 :)不过我想以后看看实现直接把文件上传到阿里云 OSS 。
6 年 7 个月 以前