账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    nodejs、express、MongoDB,接口响应时间在1200毫秒左右
    26
    0

    使用nodejs、express和MongoDB做了一套服务,但是接口的响应时间很长,1200毫秒左右
    测试去掉查询数据库,发现响应时间缩减为200毫秒左右
    以下是我的代码,求教

    var express = require("express");
    var fs = require('fs');
    var path = require('path');
    var crypto = require('crypto'); //加载加密文件
    var redis = require('redis');   // Redis缓存数据库
    var router = express.Router();
    var MongoClient = require('mongodb').MongoClient;
    var ObjectID = require('mongodb').ObjectID;
    var url = "mongodb://localhost:27017/books";
    // 缓存区
    var buf = new Buffer.alloc(2048);
    var client = redis.createClient(6379, 'localhost', {});
    
    // 密码加盐加密
    function encrypt(pw){
        var key = Math.random().toString().substring(2);
        pw = pw + key;
        var md5 = crypto.createHash('md5');
        var r = md5.update(pw).digest('hex');
        return {key: key, pw: r}
    }
    
    client.on('ready', function(err){
        if(err) throw err
        console.log('redis ready')
    });
    
    // app端注册
    router.post('/enroll', function(req, res){
        var data = {
            userName: req.body.userName,
            sex: req.body.sex,
            userPhone: req.body.userPhone,
            userEmail: req.body.userEmail,
            password: req.body.password,
            status: 1
        }
        for(var k in data){
            if(!data[k]){
                res.json({code:4, content:"参数异常"});
                return false
            }
        }
        MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
            if (err) throw err;
            var dbo = db.db("books");
            dbo.collection("user").find({userPhone: data.userPhone}).count(function(err, num){
                if(err) throw err;
                if(num == 0){
                    // 密码加密
                    var pwObj = encrypt(data.password);
                    data.password = pwObj.pw;
                    data.key = pwObj.key;
                    dbo.collection("user").insertOne(data, function(err, result) {
                        if (err){
                            res.json({code:4, content: "服务器异常"});
                            throw err;
                        }
                        res.json({code:1, content: "添加成功"});
                    })
                }else{
                    res.json({code:2, content: "此手机号码已注册"})
                }
                db.close();
            });
        });
    });
    
    // APP端验证登录
    router.post('/login', function(req, res){
        var userPhone = req.body.userPhone;
        var password = req.body.password;
        if(userPhone && password){
            MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
                if (err) throw err;
                var dbo = db.db("books");
                dbo.collection("user").find({userPhone: userPhone}).toArray(function(err, resArr) {
                    if (err) throw err;
                    if(resArr.length>0){
                        password = password + resArr[0].key;
                        var md5 = crypto.createHash('md5');
                        var r = md5.update(password).digest('hex');
                        if(r == resArr[0].password){
                            res.json({code: 1, content: resArr[0]._id});
                        }else{
                            res.json({code: 2, content: "密码错误"});
                        }
                    }else{
                        res.json({code: 2, content: "该手机号暂未注册"});
                    }
                    db.close();
                });
            });
        }else{
            res.json({code: 4, content: "参数异常"});
        }
    });
    
    // 查询用户信息
    router.post('/findUserById', function(req, res){
        var userInfoId = req.body.userInfoId;
        if(!userInfoId){
            res.json({code:4, content: "参数异常"});
            return false;
        }
        MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
            if (err) throw err;
            var dbo = db.db("books");
            dbo.collection("user").find({_id: ObjectID(userInfoId)}).toArray(function(err, result) {
                if (err) throw err;
                res.json({code:1, content:result[0]});
                db.close();
            });
        });
    });
    
    // 分页获取书籍列表
    router.post('/findBooksOfPage', function(req, res){
        var dataNumber = req.body.dataNumber;
        var keyWord = req.body.keyWord;
        var data = {
            status: '1'
        }
        if(req.body.classes != '0'){
            data.classes = req.body.classes
        }
        if(keyWord){
            data.$or = [
                {bookName: new RegExp(keyWord)},
                {author: new RegExp(keyWord)}
            ]
        }
        MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
            if (err) throw err;
            var dbo = db.db("books");
            dbo.collection("book").find(data).skip(dataNumber).limit(10).toArray(function(err, result) {
                if (err) throw err;
                res.json({code:1, content:result});
                db.close();
            });
        });
    });
    
    // 书籍详情
    router.post('/findBookById', function(req, res){
        var id = req.body.bookInfoId;
        MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
            if (err) throw err;
            var dbo = db.db("books");
            dbo.collection("book").find({_id: ObjectID(id)}).toArray(function(err, result) {
                if (err) throw err;
                res.json({code:1, content:result[0]});
                db.close();
            });
        });
    });
    
    // 查询书架列表
    router.post('/findBookshelfOfPage', function(req, res){
        var userInfoId = req.body.userInfoId;
        var dataNumber = req.body.dataNumber;
        MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
            if (err) throw err;
            var dbo = db.db("books");
            dbo.collection("bookshelf").find({userInfoId: userInfoId}).skip(dataNumber).limit(10).toArray(function(err, result) {
                if (err) throw err;
                res.json({code:1, content:result});
                db.close();
            });
        });
    });
    
    // 加入书架
    router.post('/addToBookshelf', function(req, res){
        var data = {
            userInfoId: req.body.userInfoId,
            bookInfoId: req.body.bookInfoId,
            bookName: req.body.bookName,
            author: req.body.author,
            bookImg: req.body.bookImg,
            bookSize: req.body.bookSize,
            location: "0"
        }
        for(var k in data){
            if(k != 'location' && !data[k]){
                res.json({code:4, content: "参数异常"});
                return false;
            }
        }
        MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
            if (err) throw err;
            var dbo = db.db("books");
            dbo.collection("bookshelf").find({userInfoId: data.userInfoId, bookInfoId: data.bookInfoId}).toArray(function(err, result) {
                if (err) throw err;
                if(result.length>0){
                    res.json({code:2, content: "书籍已存在于书架"});
                }else{
                    dbo.collection("bookshelf").insertOne(data, function(err, result){
                        if (err) throw err;
                        res.json({code:1, content:"已添加至书架"});
                    })
                }
                db.close();
            });
        });
    });
    
    // 下载图片接口
    router.get('/downloadImg', function(req, res){
        var img = req.query.fileName;
        if(!img){return}
        var url = path.resolve(__dirname, '../public/scratch_file/', img);
        try{
            fs.accessSync(url);
            res.sendFile(url);
        }catch(e){
            url = path.resolve(__dirname, '../public/books_img/', img);
            res.sendFile(url);
        }
    });
    
    // 删除书架书籍
    router.post('/delBookshelf', function(req, res){
        var bookInfoId = req.body.bookInfoId;
        var userInfoId = req.body.userInfoId;
        MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
            if (err){
                res.json({code:4, content: "服务器异常"});
                throw err;
            }
            var dbo = db.db("books");
            dbo.collection("bookshelf").deleteOne({userInfoId:userInfoId,bookInfoId: bookInfoId}, function(err, result) {
                if (err){
                    res.json({code:4, content: "服务器异常"});
                    throw err;
                }
                res.json({code:1, content: "删除成功"});
                db.close();
            });
        });
    });
    
    // 查询书架书籍
    router.post('/findBookshelfById', function(req, res){
        var bookInfoId = req.body.bookInfoId;
        var userInfoId = req.body.userInfoId;
        MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
            if (err){
                res.json({code:4, content: "服务器异常"});
                throw err;
            }
            var dbo = db.db("books");
            dbo.collection("bookshelf").find({userInfoId:userInfoId,bookInfoId: bookInfoId}).toArray(function(err, result) {
                if (err){
                    res.json({code:4, content: "服务器异常"});
                    throw err;
                }
                res.json({code:1, content: result});
                db.close();
            });
        });
    });
    
    // 分页读取书籍
    router.post('/findBookOfPage', function(req, res){
        var userInfoId = req.body.userInfoId;
        var bookInfoId = req.body.bookInfoId;
        var location = req.body.location;
        if(!bookInfoId && !location){
            res.json({code:4, content: "服务器异常"});
            return false
        }
        MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
            var dbo = db.db("books");
            dbo.collection("book").find({_id: ObjectID(bookInfoId)}).toArray(function(err, result) {
                if (err) throw err;
                if(result[0].bookUrl){
                    var bookUrl = './public/books_txt/'+result[0].bookUrl;
                    fs.open(bookUrl, 'r', function (err, fd) {
                        if (err) throw err;
                        // 读取文件
                        fs.read(fd, buf, 0, buf.length, location, function (err, bytes) {
                            if (err) throw err;
                    
                            // 仅输出读取的字节
                            if (bytes > 0) {
                                res.json({code:1, content: buf.slice(0, bytes).toString()});
                            }else{
                                res.json({code:2, content: "终章"});
                            }
                    
                            // 关闭文件
                            fs.close(fd, function (err) {
                                if (err) throw err;
                            })
                        })
                    })
                }else{
                    res.json({code:4, content: "服务器异常"});
                }
                
            });
            var whereStr = {userInfoId: userInfoId,bookInfoId: bookInfoId};  // 查询条件
            var updateStr = {$set: { location: location }};
            dbo.collection("bookshelf").updateOne(whereStr, updateStr, function(err, result) {
                if (err) throw err;
            });
            db.close();
        });
    });
    
    // MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
    //     var dbo = db.db("books");
    //     // 删除
    //     // dbo.collection("bookshelf").deleteOne({"_id": ObjectID('5c384e1460e7462390755a67')}, function(err, result) {
    //     //     if (err) throw err;
    //     // });
    //     // 查询
    //     dbo.collection("bookshelf").find().toArray(function(err, result) {
    //         if (err) throw err;
    //         console.log(result);
    //     });
    
    //     db.close();
    // });
    
    module.exports = router;
    0
    打赏
    收藏
    点击回答
        全部回答
    • 共 0 条
    • 有你才幸福 普通会员 1楼

      在Node.js、Express和MongoDB之间,你可能需要关注接口响应时间,因为它是直接影响用户体验的关键因素之一。以下是一些可能有助于改善接口响应时间的建议:

      1. 优化数据库查询:确保你的数据库查询性能足够好,以避免数据库回滚和查询等待时间过长。这可能包括使用索引,优化查询语句,或者使用更高效的数据存储结构。

      2. 优化应用程序架构:在设计应用程序架构时,需要考虑其对响应时间的影响。例如,如果应用程序需要从数据库获取大量数据,那么可能需要考虑使用分页、索引或延迟加载等技术来减少响应时间。

      3. 使用CDN:CDN(内容分发网络)可以帮助你的应用程序更快地加载内容,从而减少延迟时间。此外,CDN还可以帮助你的应用程序处理大量的流量,进一步提高性能。

      4. 使用异步编程:异步编程可以避免阻塞主线程,从而提高应用程序的响应时间。例如,你可以使用async/await等技术来执行异步操作。

      5. 使用数据库缓存:数据库缓存可以帮助你的应用程序更快地获取数据,从而减少响应时间。例如,你可以使用Redis、Memcached等缓存技术来缓存数据库查询结果。

      6. 优化服务器性能:确保你的服务器性能足够好,可以处理大量的并发请求。例如,你可以使用负载均衡器来分配负载,或者使用硬件加速器来提高服务器性能。

      7. 使用流处理技术:流处理技术可以帮助你的应用程序更快地处理大量的数据,从而减少响应时间。例如,你可以使用Kafka、Flume等流处理技术来处理大量数据。

      8. 使用消息队列:消息队列可以帮助你的应用程序更快地处理大量的数据,从而减少响应时间。例如,你可以使用RabbitMQ、Kafka等消息队列来处理大量数据。

      总的来说,要提高Node.js、Express和MongoDB之间的接口响应时间,需要综合考虑多个因素,包括数据库查询、应用程序架构、CDN、异步编程、数据库缓存、服务器性能、流处理技术和消息队列等。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部