我想知道我是否正在构建我的nodejs应用程序以考虑最佳性能.我主要关注的是如何通过模块移动我的应用程序参考.
基本上在我的app.js文件中,我正在声明我的所有要求,库等:
var app = {
config : require('../../config.json'),
restify : require('restify'),
path : require('path'),
mongo : require('mongodb'),
model : require('./models.js'),
step : require('step'),
q : require('q'),
api : require('./api_util.js'),
underscore : require('underscore')
};
Run Code Online (Sandbox Code Playgroud)
在我的导出中,我传递了整个app对象.现在,鉴于我对JavaScript的了解(如果我错了,你可以纠正我),这不会创建对象的新实例,它只是将对象作为指针传入并在内存中引用相同的对象.
现在我发现自己除此之外(为了方便)在我的restify库中(可以用Express完成),我将app值附加到服务器请求对象,如下所示:
app.server.pre(function (request, response, next) {
request.app = app;
return next();
});
Run Code Online (Sandbox Code Playgroud)
因此,对于每一个请求,如果我需要快速访问我的任何库声明,配置等,我可以轻松访问request.app.我也不认为这是一个问题,同样的逻辑,对象作为一个指针返回到相同的内存空间,所以我不会加倍内存使用或任何东西.
是否有更好/更简单的方法来构建它?
请考虑以下用于其余API节点服务器的代码.
var restify = require('restify');
var server = restify.createServer();
server.get('/echo/:name', function (req, res, next) {
res.send({name: req.params.name});
next();
});
server.listen(8080, function () {
console.log('%s listening at %s', server.name, server.url);
});
Run Code Online (Sandbox Code Playgroud)
使用节点运行该服务器:
$ node echo.js
restify listening at http://0.0.0.0:8080
Run Code Online (Sandbox Code Playgroud)
它显示0.0.0.0哪个是错的.
任何人都可以在开启时如何控制台登录服务器的确切IP?
谢谢
rest_server.listen(config.appPort, function () {
var adrs = require('os').networkInterfaces();
console.log(adrs);
console.log('%s listening at %s', rest_server.name, rest_server.url);
});
Run Code Online (Sandbox Code Playgroud)
输出:
{ 'Local Area Connection': [ { address: '192.168.3.60', family: 'IPv4', internal
: false } ],
'Loopback Pseudo-Interface 1': …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用everyauth来处理用restify创建的rest api的身份验证.但找不到起点.我希望做的事情如下:
var restify = require('restify');
var everyauth = require('everyauth');
var server = restify.createServer();
server.use(everyauth.middleware());
Run Code Online (Sandbox Code Playgroud)
但是,restify不接受everyauth中间件.
我如何设置解决方案和每个人?
我很好奇是否有人能够提供一些有关抽象使用Node.js + Restify + Mongoose构建的API的最佳方法的见解.在来自MVC/PHP背景之后,发现Node应用程序没有字符串/定义结构很有意思.
截至目前,我有我的app.js文件,自动加载我的routes.js文件,所有模型js文件等.
困惑主要在于我的路线应该如何与来自Mongo的数据进行交互.这是我的代码如何布局的基本概述.
app.js:
/**
* Require Dependencies
*/
var restify = require('restify')
, mongoose = require('mongoose')
, config = require('./config')
, routes = require('./routes');
/**
* Create Server & Define Settings
*/
var server = restify.createServer({
name: config.name,
version: config.version
});
/**
* Common Handlers
*/
server.use(restify.acceptParser(server.acceptable));
server.use(restify.queryParser());
server.use(restify.bodyParser());
server.use(restify.jsonp());
/**
* Connect to Mongo Database
*/
mongoose.connect(config.mongo.uri, function(err) {
// assign connection to var so we can pass it down the chain
var …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个简单的图像代理服务器(如果这不是正确的措辞,请随时纠正我).
使用案例:
这是我目前的版本.它似乎提供了一个损坏的图像文件(并通过Web浏览器打开时打开下载提示...).
更新:下面的工作版本.
var restify = require("restify");
var http = require("http");
var request = require("request");
var server = restify.createServer();
server.listen(1234, function() {
console.log("%s listening at %s", server.name, server.url);
});
server.get("/image", getImage);
function getImage(req, res, next) {
var imageURL = "http://png-5.findicons.com/files/icons/409/witchery/128/cat.png";
http.get(imageURL, function(response) {
var imageSize = parseInt(response.header("Content-Length"));
var imageBuffer = new Buffer(imageSize);
var bytes = 0;
response.setEncoding("binary");
response.on("data", function(chunk) {
imageBuffer.write(chunk, bytes, "binary");
bytes += chunk.length;
});
response.on("end", function() {
console.log("Download complete, …Run Code Online (Sandbox Code Playgroud) 在我们的restify应用程序中,当我们传递错误时next,返回一个通用的500错误,这一切都很好.但是,我还需要在某处记录错误的详细信息,以便我知道发生了什么.
以前,我在一个快速应用程序上工作,集中的错误处理中间件使我们能够在接收错误时执行任何代码,例如日志记录.
集中记录错误详细信息的"解决方法"是什么?我不想在整个应用程序中撒上日志记录语句.
我试图使用快速Cors与我的resitfy服务器,它似乎并没有否认来自其他ips的请求.我在本地工作所以我尝试将原点设置为随机的公共IP,但我的所有请求仍在进行中
这是我的路线:
module.exports = function(app) {
var user = require('./controllers/userController');
var cors = require('cors');
var corsOptions = require('./cors.json');
app.post('/auth/signup', cors(corsOptions),user.createUser);
app.post('/auth/login', cors(corsOptions), user.validateUser);
app.post('/auth/generateKeys', cors(corsOptions), user.generateKeys);
app.post('/auth/generateToken', user.generateToken);
};
Run Code Online (Sandbox Code Playgroud)
这是我的cors.json文件,我已经设置了一个随机的ip:
{
"origin": "http://172.16.12.123",
"optionsSuccessStatus": 200,
}
Run Code Online (Sandbox Code Playgroud)
在路线上设置了cors我可以在邮递员中看到以下内容,但请求仍在进行中?我希望访问被拒绝响应.
Access-Control-Allow-Origin→ http://172.16.12.123
使节点更好地输出JSON的正确方法是什么(即使用换行符和缩进)?
我基本上希望它输出类似的东西JSON.stringify(object, null, 2),但我认为没有办法配置restify来做到这一点.
没有补丁修改的最佳方法是什么?
以下是我的代码
restify = require("restify")
passport = require("passport")
GoogleStrategy = require("passport-google").Strategy
jsonContentType = (req, res, next) ->
res.setHeader("content-type", "application/json")
next(req, res, next)
server = restify.createServer(
name: "Sparked API"
)
passport.use(new GoogleStrategy({
returnURL: "http://localhost:8080/auth/google/return"
realm: "http://localhost:8080/"
}, (id, profile, done) ->
done()
))
server.use(jsonContentType)
server.get("/", (req, res, next) ->
res.send(
message: "hello world!"
)
)
server.get("/auth/google", passport.authenticate("google"))
server.get("/auth/google/return", passport.authenticate("google", {
successRedirect: "/"
failureRedirect: "/"
}))
server.listen(8080, -> console.log("restify listening on 8080"))
Run Code Online (Sandbox Code Playgroud)
看来我即使使用非常简化的版本也会获得重定向循环
server.get("/auth/google/return", passport.authenticate("google", {
successRedirect: "/"
failureRedirect: "/"
}))
Run Code Online (Sandbox Code Playgroud)
/是未经身份验证的URL,这是如何导致重定向循环的?我也试过加入 …
数组和循环,但我希望能够并行运行所有这些,因为我不想一个接一个地运行.
我基本上希望将所有端点调用状态代码,正文和时间存储为数组,并将它们作为结果返回,而不管端点中是否存在错误.
我正在使用Bluebird,我如何使用它的功能来解决这个问题?
node.js ×10
restify ×10
javascript ×5
express ×2
bluebird ×1
coffeescript ×1
cors ×1
everyauth ×1
json ×1
mongodb ×1
mongoose ×1
passport.js ×1
promise ×1