我在站点中有.html,.js,.png,.css等文件的多级集合.看看我的网站hiearchy如下所示:
index.html
child1
index.html
page1.html
page2.html
...
child2
grandchild1
index.html
grandchild2
index.html
index.html
page1.html
page2.html
resources
css
myTheme.css
img
logo.png
profile.png
js
jquery.js
...
...
Run Code Online (Sandbox Code Playgroud)
我正在迁移它以在Node.js下运行.我被告知我必须使用RESTIFY.目前,我已经为我的服务器编写了以下内容:
var restify = require('restify');
var fs = require('fs');
var mime = require('mime');
var server = restify.createServer({
name: 'Demo',
version: '1.0.0'
});
server.use(restify.acceptParser(server.acceptable));
server.use(restify.queryParser());
server.use(restify.bodyParser());
server.get('/', loadStaticFile);
server.get('/echo/:name', function (req, res, next) {
res.send(req.params);
return next();
});
server.listen(2000, function () {
console.log('Server Started');
});
function loadStaticFile(req, res, next) {
var filePath = __dirname + getFileName(req); …Run Code Online (Sandbox Code Playgroud) 我仍然围绕着Node,但我有一个非常简单的问题.我看到很多节点示例,人们在一个app.js文件中声明他们的路由和所有逻辑(或者有时将它们分成子文件).
我的问题基本上是:最好是将所有路由声明保存在应用程序中,还是引导映射到文件结构的通用路由.这似乎是一个原始问题,但我的目标是掌握节点内最有效的东西.
我目前正在使用Restify构建一个API处理程序,但我有另一个使用Express的应用程序(因此这个问题可能会回答这两个问题).
在我的路线中,我可以声明一个单一的路线引导程序,如下所示:
app.all('/api/:package/:controller', function(request, response) {
var controller = require(
'../' + request.params.package + '/api/' + request.params.controller
);
controller.index(request, response);
response.end();
});
Run Code Online (Sandbox Code Playgroud)
这基本上接受来自API的所有调用,并以适当的api控制器为目标.或者,我可以单独声明每个路由,甚至可以编写一个遍历每个控制器的循环,并在init上声明它们.所以:
for (var i in packages.controllers) {
app.all('api/' + package + '/' + controllers[i].name, function(request, response) {
var controller = require(
'../' + request.params.package + '/api/' + request.params.controller
);
controller.index(request, response);
}
}
Run Code Online (Sandbox Code Playgroud)
packages.controllers是所有可能的控制器的数组.注意上面的代码不准确,我有一个HMVC文件夹结构,所以代码比上面的要复杂一点.但你明白了.
我想知道其中任何一个的后果是什么,以及它是否真的重要?
谢谢!
文件说明:
请注意,您始终可以将其放在每个URL路由上,以便为不同的资源启用不同的请求速率(例如,一个路由,比如/ my/slow/database比/ my/fast/memcache更容易overwhlem).
我无法找到如何完全实现这一点.
基本上,我想以与我的API不同的节流速率提供静态文件.
我正在使用restify建筑api,它很棒.但我需要在同一个应用程序中渲染一些网页.
我可以在一个应用程序中一起使用express和restify吗?
这是app.js中restify服务器的代码
var restify = require('restify');
var mongoose = require('mongoose');
var server = restify.createServer({
name : "api_app"
});
server.use(restify.queryParser());
server.use(restify.bodyParser());
server.use(restify.CORS());
mongoose.connect('mongodb://localhost/db_name');
server.get('/', routes.index);
server.post('/api_name', api.api_name);
server.listen(8000 ,"localhost", function(){
console.log('%s listening at %s ', server.name , server.url);
});
Run Code Online (Sandbox Code Playgroud)
如何在同一个app.js中创建快速服务器?
谢谢
我正在使用node.js restify模块.我有一个REST API,它在json中输出单个MySQL查询的结果.这是API的代码;
var rest_api_get_list = function (app, url_name) {
function respond(req, res, next) {
var door_mac = req.query.door_mac;
var connection = own_mysql.getMySQL_connection();
var query_str =
"SELECT doors.mac_addr, " +
"sensors.sensor_type " +
"FROM sensors " +
"WHERE (doors.mac_addr = ?) "
;
var query_var = [door_mac];
var query = connection.query(query_str, query_var, function (err, rows, fields) {
//if (err) throw err;
if (err) {
//throw err;
console.log(err);
logger.info(err);
}
else {
res.send(rows);
}
});
return next();
}
app.get(url_name, respond);
}; …Run Code Online (Sandbox Code Playgroud) 目前正在开发具有restify的API,但仍然不能习惯在头文件中指定API版本.它似乎不是非常用户友好.
有没有办法让版本成为网址的一部分?
示例是:
http://domain.com/api/v1/action
Run Code Online (Sandbox Code Playgroud)
在我的情况下甚至更好:
http://api.domain.com/v1/action
Run Code Online (Sandbox Code Playgroud)
谢谢
更新4:通过在函数外部实例化restify客户端(请参阅controllers/messages.js)并在每次请求后调用global.gc(),内存增长速度似乎已经降低了很多(每10秒约500KB).然而,内存使用量仍在不断增长.
Update3:发过这篇文章:https://journal.paul.querna.org/articles/2011/04/05/openssl-memory-use/
值得注意的是,我正在使用HTTPS和Restify.
更新2:将以下代码更新为当前状态.我试过用Express换掉Restify.可悲的是,这没有任何区别.似乎链条末端的api调用(restify - > mongodb - > external api)会导致所有内容保留在内存中.
更新1:我用标准的MongoDB驱动程序替换了Mongoose.内存使用似乎增长速度较慢,但泄漏仍然存在.
我一直在努力寻找这种泄漏现在几天.
我正在使用Restify和Mongoose运行API ,并且对于每个API调用,我至少进行一次MongoDB查找.我有大约1-2k用户在一天内多次点击API.
我试过了什么
那么,可能出现什么问题呢?
我只使用一个API用户完成了上述测试.这意味着Mongoose只能一遍又一遍地抓取同一个文档.与生产的不同之处在于许多不同的用户都在使用API,这意味着mongoose会获得大量不同的文档.
当我启动nodejs服务器时,内存会迅速增长到100MB-200MB.它最终稳定在500MB左右.这是否意味着它会为每个用户泄漏内存?一旦每个用户访问过API,它都会稳定下来吗?
我在下面列出了我的代码,其中概述了我的API的一般结构.我很想知道我的代码或任何其他方法是否存在严重错误,以找出导致高内存使用的原因.
码
app.js
var restify = require('restify');
var MongoClient = require('mongodb').MongoClient;
// ... setup restify server and mongodb
require('./api/message')(server, db);
Run Code Online (Sandbox Code Playgroud)
API/message.js
module.exports = function(server, db) {
// Controllers used for retrieving accounts via MongoDB and communication with an external api
var accountController = require('../controllers/accounts')(db);
var …Run Code Online (Sandbox Code Playgroud) 我正在设计客户端/服务器同步功能.客户端向服务器发送一堆已更改的事件.服务器将根据请求的项目状态进行创建,删除或修改.在数据库操作之后,服务器需要将摘要发送回客户端.
下面是我的服务器端代码的摘录,设计有mongoose和restify.
var EventModel = mongoose.model('Event', eventSchema);
server.post("/sync", function (req, res, next) {
var events = req.params.events;
var created = [], deleted = [], updated = [];
events.forEach(function (elem) {
if (elem.status == 0) {
// Delete
EventModel.remove({ _id: elem.uuid }, function (err, event) {
if (!err) deleted.push({uuid: elem.uuid});
});
} else if (elem.status == 1) {
// Create and update uuid
var event = new EventModel(elem);
event.save(function (err, doc) {
if (!err) {
elem.uuid = event._doc._id;
created.push(elem);
}
}); …Run Code Online (Sandbox Code Playgroud) 我花了这么直接的事情.我只想使用nodejs,mongoose,restify stack对用户模型进行CRUD操作.我的mongo实例是在mongolab上.用户应包含"loc"字段.用户架构如下:
var mongoose = require('mongoose')
var Schema = mongoose.Schema;
var userSchema = new Schema( {
email_id : { type: String, unique: true },
password: { type: String},
first_name: String,
last_name: String,
age: String,
phone_number: String,
profile_picture: String,
loc: {
type: {},
coordinates: [Number]
}
});
userSchema.index({loc:'2d'});
var User = mongoose.model('user', userSchema);
module.exports = User;
Run Code Online (Sandbox Code Playgroud)
其余api用于发布如下:
create_user : function (req, res, next) {
var coords = [];
coords[0] = req.query.longitude;
coords[1] = req.query.latitude;
var user = new User(
{
email_id …Run Code Online (Sandbox Code Playgroud) 我正在使用以下脚本,但是这个脚本抛出错误,即serveStatic不是我安装的函数,使用此命令"npm install --save restify"
var restify = require('restify');
var builder = require('botbuilder');
var server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function () { });
// Create the chat connector for communicating with the Bot Framework Service
var connector = new builder.ChatConnector({
appId: '***',
appPassword: '***'
});
// Listen for messages from users
server.post('/api/messages', connector.listen());
server.get('/', restify.serveStatic({
directory: __dirname,
default: '/index.html'
}));
var bot = new builder.UniversalBot(connector, function (session) {
var msg = session.message;
if (msg.attachments && msg.attachments.length > 0) …Run Code Online (Sandbox Code Playgroud) node.js ×10
restify ×10
mongoose ×3
express ×2
arrays ×1
javascript ×1
memory-leaks ×1
mongodb ×1
npm ×1
rest ×1
routes ×1
synchronous ×1