Node.js/Express Tips

Node.js/Express知识点积累

目录

Node.js

  • __dirname和process.cwd()的区别。

    • __dirname指向正在执行的脚本模块所在的目录。(模块所在目录,D:\Dev\project\server\utils)
    • process.cwd()方法返回Node.js进程的当前工作目录。(app.js所在目录,D:\Dev\project\server)
  • npm install --save express。--save的作用。

    --save选项会更新package.json文件
  • http默认端口号80,https是默认端口号443,一般端口号要1023< port <65535。

  • 获取客户端IP地址。

                                 
                                    var getClientIP = function (req) {
                                            return req.headers['x-forwarded-for'] ||
                                                req.connection.remoteAddress ||
                                                req.socket.remoteAddress ||
                                                (req.connection.socket ? req.connection.socket.remoteAddress : null);
                                        }
                                 
                            
    Express中req.connection.remoteAddress结果格式为"::ffff:10.79.101.62", 如果只想获得ipv4地址,可以在app.lister中添加"0.0.0.0"参数的方式解决。
                                
                                    app.listen(3006, "0.0.0.0", function (err) {
                                        if (err) {
                                            util.logger.error(err);
                                        } else {
                                            util.logger.info("App listening on port 3006");
                                        }
                                    });
                                
                            
  • 获取启动命令行参数。

    所有命令行参数都可以通过process.argv遍历访问。

    • 第一个参数为node命令目录(D:\Program Files\nodejs\node.exe)
    • 第二个参数为主应用程序目录(D:\Dev\WorkSpace\project\wifi\server.js)
                                
                                    var argv = process.argv;
                                    var argvMap = {};
                                    argv.forEach(function (v, index) {
                                        var vs = v.split("=");
                                        if (vs.length === 2) {
                                            argvMap[vs[0].trim()] = vs[1].trim();
                                        }
                                    });
                                
                            
  • 捕获&处理应用异常。

    这里的异常指的应用级别的异常,比如读文件异常导致应用自动exit,一般写入系统日志,方便查询。

    在process上添加uncaughtException的异常监听。

                                
                                    process.on('uncaughtException', function (err) {
                                        logger.error("[Inside 'uncaughtException' event] " + err.stack || err.message);
                                    });
                                
                            

Express

  • 如何指定favicon.ico路径。

                                
                                    app.use('/favicon.ico', express.static('server/favicon.ico'));
                                
                           
  • 在express.Router中是否可以像在应用一样使用其它router路由模块。

    经测试不可以(Express v4.16.2)。
  • Express中如何添加404处理。

    在Express中,404响应不是错误,所以错误处理程序中间件不会捕获它们,404表示Express已经执行了所有的中间件功能和路由,发现它们都没有响应。

    可以通过在堆栈底部,在所有其他函数下面(app.listen之前)添加一个中间件函数,来处理一个404响应

                                
                                    app.use( function (req, res, next) {
                                        util.logger.error("未发现:" + req.url);
                                        if (util.http.isAjaxRequest(req)) {
                                            util.ajax.fail(req, res, "未发现" + req.url);
                                        } else {
                                            res.redirect("/");
                                            //res.status(404).send("未发现:" + req.url)
                                        }
                                    });
                                
                            
  • Express中如何设置静态文件(JS/CSS)是否使用浏览器缓存。

    通过设置静态文件的maxAge实现。

                                
                                    app.use('/libs', express.static('client/libs/', {
                                        maxAge: 86400000//cache static files
                                    }));
                                
                            
  • express-session中如何将不用app应用的session分开。

    如果有多个应用程序在同一主机名上运行(这只是名称,即localhost或127.0.0.1;不同的方案和端口没有命名不同的主机名),那么您需要将会话cookie彼此分开。

    最简单的方法是简单地为每个应用程序设置不同的名称。

                                
                                    app1.use(session({
                                        name:"sid1"
                                    }));
    
                                    app2.use(session({
                                        name:"sid2"
                                    }));
                                
                            
  • 解决bodyParser.json中数据过大引起的"request entity too large"问题

    通过limit控制最大请求体大小。 如果这是一个数字,则该值指定字节数; 如果是字符串,则将值传递给字节库以进行解析。 默认为'100kb'。

                                
                                    app.use(bodyParser.json({limit: '50mb'}));