如何使用passport.js通过RESTful API而不是通过Web界面处理身份验证(例如本地和Facebook)?
特别关注的是处理从回调到RESTful响应(JSON)的数据传递与使用典型的res.send({data:req.data}),设置重定向到Facebook的初始/登录端点(/登录不能是通过AJAX访问,因为它不是JSON响应 - 它是一个带有回调的Facebook重定向.
我找到了https://github.com/halrobertson/test-restify-passport-facebook,但我无法理解它.
此外,passport.js如何存储身份验证凭据?服务器(或它是服务吗?)由MongoDB支持,我希望凭证(登录和盐水的pw)存储在那里,但我不知道passport.js是否具有这种类型的功能.
我有一个使用Restify和Mongoose构建在node.js中的REST服务和一个带有大约30.000个常规文档的集合的mongoDB.我的节点服务通过pmx和pm2运行.
昨天,突然,节点开始消除错误消息"MongoError:拓扑被破坏",仅此而已.我不知道这是什么意思,什么可能触发这个.谷歌搜索时也没有太多东西可以找到.所以我想我会问这里.
今天重新启动节点服务之后,错误就停止了.我也有其中一个正在运行中,它让我感到害怕,这可能会在任何给定的时间发生在运行那里的设置的一个非常重要的部分......
我正在使用以下版本的提到的包:
我有要求在node.js中构建REST API,并且正在寻找比express.js更轻量级的框架,这可能避免了不需要的功能,并且就像构建REST API的定制框架一样.对于相同的情况,建议从其介绍中进行修改.
阅读为什么使用解决而不表达?看起来好像是一个很好的选择.
但是当我用负载尝试两者时,出乎意料的是.
我在Restify上制作了一个示例REST API,并且每秒充满1000个请求.给我一个惊喜,一段时间后路线开始没有响应.在express.js上构建的同一个应用程序处理所有.
我目前正在将负载应用于API
var FnPush = setInterval(function() {
for(i=0;i<1000;i++)
SendMsg(makeMsg(i));
}, 1000);
function SendMsg(msg) {
var post_data = querystring.stringify(msg);
var post_options = {
host: target.host,
port: target.port,
path: target.path,
agent: false,
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': post_data.length,
"connection": "close"
}
};
var post_req = http.request(post_options, function(res) {});
post_req.write(post_data);
post_req.on('error', function(e) {
});
post_req.end();
}
Run Code Online (Sandbox Code Playgroud)
结果我看起来合情合理吗?如果是这样表达的效率高于在这种情况下的解决方案?或者我测试它们的方式有任何错误吗?
改善的行为
当负载超过1000 req.s时,它在1秒内停止处理,直到1015 req.s然后什么都不做.即.我计算的计数器用于计算1015之后停止递增的传入请求.
当喂负载甚至100 reqs.它每秒钟收到1015并且之后没有响应.
我编写了一个使用Node js"restify"框架的小API.此API接收请求(实际上是"/"之后的任何内容),然后将该请求发送到另一台服务器.从服务器获取响应并将响应传递回原始请求源.对于这个API我使用restify服务器和客户端.
以下是用于更好理解的API代码.
var apiServer = require('apiServer');
apiServer.start();
var restify = require('restify');
var assert = require('assert');
function onRequest(request, response, next)
{
var client = restify.createStringClient({
url: 'http://example.com'
});
client.get('/' + request.params[0], function(err, req, res, data) {
assert.ifError(err);
response.setHeader('Content-Type', 'text/html');
response.writeHead(res.statusCode);
response.write(data);
response.end();
});
next();
}
function start()
{
var server = restify.createServer();
server.get(/^\/(.*)/, onRequest);
server.listen(8888);
console.log("Server has started.");
}
exports.start = start;
Run Code Online (Sandbox Code Playgroud)
现在我需要知道Node.js response.write和之间的区别response.send.因为response.write我可以设置标题并在其中写入,但在使用时不能对标题执行任何操作response.send.当我用response.send用setHeader()还是writeHeader()我得到这个错误:
http.js:691
throw new … 我有一个使用restify模块创建的REST api,我想允许跨源资源共享.最好的方法是什么?
我在节点上运行Web服务器,其代码如下所示
var restify = require('restify');
var server = restify.createServer();
var quotes = [
{ author : 'Audrey Hepburn', text : "Nothing is impossible, the word itself says 'I'm possible'!"},
{ author : 'Walt Disney', text : "You may not realize it when it happens, but a kick in the teeth may be the best thing in the world for you"},
{ author : 'Unknown', text : "Even the greatest was once a beginner. Don't be afraid to take that first …Run Code Online (Sandbox Code Playgroud) 这对我来说有点不清楚(我刚刚开始使用Node和Mongo),而且由于服务器性能和应变(我认为这是另一个问题,我真的很担心,但我会在帖子的结尾).
所以,假设我正在编写一个带有Node.js和Restify的API,其中每个API端点对应一个函数,我应该:
a)打开db连接并将其存储在全局var中,然后在每个函数中使用它?
例:
// requires and so on leave me with a db var, assume {auto_reconnect: true}
function openDB() {
db.open(function(err, db) {
// skip err handling and so on
return db;
}
}
var myOpenDB = openDB(); // use myOpenDB in every other function I have
Run Code Online (Sandbox Code Playgroud)
b)打开数据库连接,然后将所有内容放在一个巨大的闭包中?
例:
// same as above
db.open(function(err, db) {
// do everything else here, for example:
server.get('/api/dosomething', function doSomething(req, res, next) { // (server is an instance of a Restify …Run Code Online (Sandbox Code Playgroud) 我正在学习使用Node.js. 目前,我有一个如下所示的文件夹结构:
index.html
server.js
client
index.html
subs
index.html
page.html
res
css
style.css
img
profile.png
js
page.js
jquery.min.js
Run Code Online (Sandbox Code Playgroud)
server.js是我的网络服务器代码.我使用命令行运行它node server.js.该文件的内容是:
var restify = require('restify');
var server = restify.createServer({
name: 'Test App',
version: '1.0.0'
});
server.use(restify.acceptParser(server.acceptable));
server.use(restify.queryParser());
server.use(restify.bodyParser());
server.get('/echo/:name', function (req, res, next) {
res.send(req.params);
return next();
});
server.listen(2000, function () {
console.log('%s running on %s', server.name, server.url);
});
Run Code Online (Sandbox Code Playgroud)
如您所见,此服务器依赖于RESTIFY.我被告知必须使用RESTIFY.但是,我无法弄清楚如何提供静态文件.例如,如何在我的应用程序中为*.html,*.css,*.png和*.js文件提供服务?
谢谢!
场景:我们的开发人员正在尝试用Node.JS Restful API替换Web服务(用C#.Net编写).
问题:现在我们需要按原样处理传入的请求(我们无法控制它).所以以下是传入URL的格式:
http://www.website.com/Service.aspx?UID=Trans001&FacebookID=ae67ea324&GetDetailType=FULL
我能够处理如下的URL:
http://www.website.com/service/Trans001/ae67ea324/FULL
我可以从上面的URL解析/读取参数
码:
var server = require('restify').createServer();
function respond(req, res, next) {
console.log("req.params.UID:" + req.params.UID);
console.log("req.params.FacebookID:" + req.params.FacebookID);
console.log("req.params.GetDetailType" + req.params.GetDetailType);
}
server.get('/service/:UID/:FacebookID/:GetDetailType', respond);
server.listen(8080, function () {
console.log('%s listening at %s', server.name, server.url);
});
Run Code Online (Sandbox Code Playgroud)
问题:如何从URL中读取格式为的多个参数http://www.website.com/Service.aspx?UID=Trans001&FacebookID=ae67ea324
request.querystring node.js query-string querystringparameter restify
我有以下代码:
app.js
[...]
server.get(/\/docs\/public\/?.*/, restify.serveStatic({
directory: './public'
}));
server.listen(1337, function() {
console.log('%s listening at %s', server.name, server.url);
});
Run Code Online (Sandbox Code Playgroud)
我有以下文件结构
app.js
public/
index.html
Run Code Online (Sandbox Code Playgroud)
所以我尝试浏览:
http://localhost:1337/docs/public/index.html
Run Code Online (Sandbox Code Playgroud)
我明白了
{
code: "ResourceNotFound",
message: "/docs/public/index.html"
}
Run Code Online (Sandbox Code Playgroud)
我尝试了几种变体,但似乎没有一种变化.
我敢肯定它应该是非常明显的我错过了
node.js ×10
restify ×10
mongodb ×3
express ×2
backbone.js ×1
cors ×1
http ×1
javascript ×1
mongoose ×1
passport.js ×1
pm2 ×1
query-string ×1
rest ×1