nodejs全面理解(未完)

1.node常用框架express

安装

//必须先安装好node
//1cd到想安装的目录(可以先创建好文件夹)
cd F:\lxfwork\node\expdemo

//通过 npm init 命令为你的应用创建一个 package.json 文件。
npm init

//安装 Express 并将其保存到依赖列表中
npm install express --save


//第一个接口index.js
var express = require("express");
var app = express();

app.get("/getdemo",function(req,res){
    res.status(200);
    res.json({
        htmls:10,
        csss:5,
        jss:4
    });
});

app.listen(3000);

//用.filter()方法放回某条数据,下例子返回第一条
var list = [{
        id:0,
        name:"刘飞",
        asks:"怎么选择",
        reply:0
    },{
        id:1,
        name:"夏茹",
        asks:"怎么回答",
        reply:1
    }];
app.get("/questions/resolved",function(req,res){
    res.status(200);
    res.json(list.filter(function(q){
        return q && q.reply === 0;
    }));
});

express应用生成器

//全局安装express应用生成器(win下用管理员身份开启cmd)
npm install express-generator -g

//设置ejs的模板引擎
express --view=ejs demo1

//进入
cd demo1

//安装依赖
npm install

//启动(win版本)
SET DEBUG=demo1:* & npm start

//启动(mac版本/linux版本)
DEBUG=demo1:* & npm start

express应用生成器生成的 对应结构
这里写图片描述

express注意点

//添加一个请求路径中指定参数触发的回调函数。函数是对应的回调函数。回调函数的参数依次是req,res和中间件函数next。
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});

next中间件(MiddleWare)可以理解为一个对用户请求进行过滤和预处理的东西,它一般不会直接对客户端进行响应,而是将处理之后的结果传递下去。(也是一种函数)。
这里写图片描述
这里写图片描述
这里写图片描述

2express文件上传中间件Multer
Multer 是一个 node.js 中间件,用于处理 multipart/form-data 类型的表单数据,它主要用于上传文件。它是写在 busboy 之上非常高效。

注意: Multer 不会处理任何非 multipart/form-data 类型的表单数据。

Multer 会添加一个 body 对象 以及 file 或 files 对象 到 express 的 request 对象中。 body 对象包含表单的文本域信息,file 或 files 对象包含对象表单上传的文件信息。
Multer官方文档

//安装
npm install --save multer

//引用
var multer  = require('multer');

//demo
var express = require('express')
var multer  = require('multer')
var upload = multer({ dest: 'uploads/' })

var app = express()

app.post('/profile', upload.single('avatar'), function (req, res, next) {
  // req.file 是 `avatar` 文件的信息,为html中的name,<input type="file" name="avatar" size="50" />
  // req.body 将具有文本域数据,如果存在的话
})

app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) {
  // req.files 是 `photos` 文件数组的信息
  // req.body 将具有文本域数据,如果存在的话
})

var cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }])
app.post('/cool-profile', cpUpload, function (req, res, next) {
  // req.files 是一个对象 (String -> Array) 键是文件名,值是文件数组
  //
  // 例如:
  //  req.files['avatar'][0] -> File
  //  req.files['gallery'] -> Array
  //
  // req.body 将具有文本域数据,如果存在的话
})

一个完整demo,可上传任何文件。
demo来源

//index.htm:
<html>
<head>
<title>文件上传表单</title>
</head>
<body>
<h3>文件上传:</h3>
选择一个文件上传: <br />
<form action="/file_upload" method="post" enctype="multipart/form-data">
<input type="file" name="image" size="50" />
<br />
<input type="submit" value="上传文件" />
</form>
</body>
</html>

//server.js:
var express = require('express');
var app = express();
var fs = require("fs");

var bodyParser = require('body-parser');
var multer  = require('multer');

app.use(express.static('public'));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(multer({ dest: '/tmp/'}).array('image'));

app.get('/index.htm', function (req, res) {
   res.sendFile( __dirname + "/" + "index.htm" );
})

app.post('/file_upload', function (req, res) {

    console.log(req.files[0]);  // 上传的文件信息

    var des_file = __dirname + "/tmp/" + req.files[0].originalname;
    fs.readFile( req.files[0].path, function (err, data) {
        fs.writeFile(des_file, data, function (err) {
            if( err ){
                console.log( err );
            }else{
                response = {
                    message:'File uploaded successfully',
                    filename:req.files[0].originalname
                };
            }
            console.log( response );
            res.end( JSON.stringify( response ) );
        });
    });
})

var server = app.listen(8081, function () {

  var host = server.address().address
  var port = server.address().port

  console.log("应用实例,访问地址为 http://%s:%s", host, port)

})

修改版,上传的文件被随机改名称。
需用到

//安装uuid,生成随机名称
npm install uuid

//引入v1版本,根据时间生成
let uuidv1 = require('uuid/v1');

//生成对象
let name = uuidv1();

//引入nodejs自带的path api
let path = require("path");

//用path.extname()方法获取后缀,如.html .png
let a = path.extname(req.files[0].originalname);
var express = require('express');
var app = express();
var fs = require("fs");
let uuidv1 = require('uuid/v1');
let path = require("path");

//var bodyParser = require('body-parser');
var multer  = require('multer');

app.use(express.static('tmp'));
//app.use(bodyParser.urlencoded({ extended: false }));
// app.use(multer({ dest: '/tmp/'}).array('image'));
var upload = multer({ dest: 'upload/' });

app.get('/file_upload', function (req, res) {
    res.sendFile( __dirname + "/" + "index.htm" );
})

app.post('/file_upload', upload.array('image'), function (req, res) {

    console.log(req.files[0]);  // 上传的文件信息
    let name = uuidv1();
    let a = path.extname(req.files[0].originalname);
    console.log(name + a);
    let namea = name + a;

    var des_file = __dirname + "/tmp/" + namea;


    fs.readFile( req.files[0].path, function (err, data) {

        fs.writeFile(des_file, data, function (err) {
            if( err ){
                console.log( err );
            }else{
                response = {
                    message:'File uploaded successfully',
                    filename:namea
                };
            }
            console.log( response );
            // res.end( JSON.stringify( response ) );
            res.sendFile( __dirname + "/" + "index.htm" );
        });
    });
})

var server = app.listen(8081, function () {

    var host = server.address().address
    var port = server.address().port

    console.log("应用实例,访问地址为 http://%s:%s", host, port)

})

1.文件上传有以下方法

扫描二维码关注公众号,回复: 2909432 查看本文章
  • muilter.single(‘file’), //适用于单文件上传
  • muilter.array(‘file’,num), //适用于多文件上传,num为最多上传个数,上传文件的数量可以小于num,
  • muilter.fields(fields), //适用于混合上传,比如A类文件1个,B类文件2个。官方API有详细说明。

2.file为上传字段名称,当使用form表单submit方式上传时,必须与表单上传的name属性保持一致。
表单记得加上 enctype=‘multipart/form-data’

3.对上传文件大小限制,名称限制等均可在limits中加上,具体可加属性,请参考官方api。

注意点:

有时json数据会传来”type[0]”这种健,可以这么取值

var o={"type[0]":"cxh","xldigitid":123456,"topscore":2000,"topplaytime":"2009-08-20"};
console.log(o['type[0]'])

猜你喜欢

转载自blog.csdn.net/qq_27064559/article/details/82023811