我是新与和的NodeJS我做一个宁静的服务器的RESTify.所以,我有一个场景,我有很多设备(具有唯一ID)通过休息更新数据.我想要做的是验证它们并给出一个身份验证令牌.像这样的东西:
第一次:uri/api/auth - >获取令牌.
然后:uri/api/product/.... - >使用令牌和更新产品
我试图使用restify-node-token, 但我没有成功.
我正在尝试制作一个存储Json帖子的服务器,到目前为止这是服务器:
var restify = require('restify');
var server = restify.createServer();
server.post('/message/', function create(req, res, next) {
console.log(req.params)
return next();
});
server.listen(8080, function() {
console.log('%s listening at %s', server.name, server.url);
});
Run Code Online (Sandbox Code Playgroud)
我正在使用Restify客户端来发帖
var restify = require('restify');
var client = restify.createJsonClient({
url: 'http://localhost:8080',
version: '*'
});
client.post('/message/', { hello: 'world' }, function(err, req, res, obj) {
console.log('%d -> %j', res.statusCode, res.headers);
console.log('%j', obj);
});
Run Code Online (Sandbox Code Playgroud)
问题是req.params是空的.少了什么东西?
我刚刚开始尝试Restify(和NodeJS一般),我在获取用户POST数据时遇到了一些麻烦.
我有一个基本的Node应用程序.在文档和一些博客文章中,我读到它就像使用queryParser一样简单,但它不起作用.我认为问题出在我的CURL命令上.
节点应用:
var restify = require('restify');
function userCreation(request, result, next) {
console.log(request.body);
console.log(request.query);
console.log(request.params);
result.send({ name: request.params.name });
return next();
}
var server = restify.createServer({ version: '1.0.0' });
server.use(restify.gzipResponse());
server.use(restify.queryParser());
server.post({ path: '/users', versions: ['1.0.0'] }, userCreation);
server.listen(8080, function() {
console.log('%s listening at %s', server.name, server.url);
});
Run Code Online (Sandbox Code Playgroud)
CURL命令:
curl -is -X POST -H 'accept-version: 1.0.0' -d '{ "name": "John" }' http://127.0.0.1:8080/users
curl -is -X POST -H 'accept-version: 1.0.0' -d 'name=John' http://127.0.0.1:8080/users
Run Code Online (Sandbox Code Playgroud)
回应是:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 2 …Run Code Online (Sandbox Code Playgroud) 我目前正在从restified切换到Express,我注意到Express中res.send({})的输出具有漂亮的JSON和白色空间,而Restify输出在没有空格的情况下缩小.
由于JSON不适合人类消费,我更喜欢缩小的输出.是否有一种简单的方法可以让Express输出缩小的JSON,而无需单独更改所有res.send()调用?出于性能原因,我还希望设置更多的中间件.
我目前正在使用NodeJS开发RESTful Web服务并进行解析.
我已经为数据库启动并运行了node-mysql,但我也希望实现HTTP Basic身份验证.
我只用Apache和一个.htaccess文件做了一次.
但是在这里,网络服务器带来了解决方案,我这样开始:
var server = restify.createServer({
name: 'my webservice'
});
Run Code Online (Sandbox Code Playgroud)
在restify文档(http://mcavage.me/node-restify/#Bundled-Plugins)中列出了一个Authentication Parser插件,但我无法弄清楚如何使用它.
req.username即使我使用,该值也始终设置为匿名http://user:pass@url....
最好的办法是,如果我可以将它与.htpasswd文件一起使用来存储/访问用户并通过.
有谁知道如何用restify或其他模块实现这个?
我正在使用node.js restify ver4.0.3
以下简单代码用作支持HTTP的简单REST API服务器.示例API调用是http://127.0.0.1:9898/echo/message
var restify = require('restify');
var server = restify.createServer({
name: 'myapp',
version: '1.0.0'
});
server.use(restify.acceptParser(server.acceptable));
server.use(restify.queryParser());
server.use(restify.bodyParser());
//http://127.0.0.1:9898/echo/sdasd
server.get('/echo/:name', function (req, res, next) {
res.send(req.params);
return next();
});
server.listen(9898, function () {
console.log('%s listening at %s', server.name, server.url);
});
Run Code Online (Sandbox Code Playgroud)
假设我想支持HTTPS并进行API调用https://127.0.0.1:9898/echo/message
如何才能做到这一点?
我注意到,解析代码变化非常快,旧版本的旧代码可能无法与最新版本一起使用.
我正在使用node.js Restify。
我有一个 HTTP GET 请求,如下所示;
http://127.0.0.1//read_val?XXX=123&YYY=456&ZZZ=789
在我的处理函数中,要检索URL参数,相关代码将是这样的;
var api_get_func = function (app, url_path) {
function respond(req, res, next) {
var XXX= req.query.XXX;
var YYY = req.query.YYY;
var ZZZ = req.query.ZZZ;
//SQL query ...
return next();
}
app.get(url_path, respond);
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我有一个像下面这样的 HTTP GET 函数怎么办?
http://127.0.0.1//read_val?XXX=123&YYY=456
ZZZURL 中未提供该参数。如何修改代码以便ZZZ使用默认值,例如111?
`bearer = bearerHeader.replace("Bearer","");
jwt.verify(bearer, 'super_secret', function (err, decoded) {
console.log(err);
console.log(decoded);`
Run Code Online (Sandbox Code Playgroud)
这是我的代码。每当我尝试验证令牌时。我想替换标头中的Bearer以仅验证令牌。如果持有持票人,它将始终变为“错误”。当我从标题删除承载时,我会完美地工作。任何人请帮我解决这个问题。有什么办法解决这个问题?
输出:
{ [JsonWebTokenError: invalid token] name: 'JsonWebTokenError', message: 'invalid token' }
undefined
Run Code Online (Sandbox Code Playgroud) 来自 python 世界,我们大量使用了tastypie 或 Django-Rest-framework 来创建 Rest API。
通过阅读Felix Geisendörfer 的《说服老板》,我注意到以下声明:
构建轻量级 REST / JSON api 是 node.js 真正闪耀的地方。其非阻塞 I/O 模型与 JavaScript 相结合,使其成为包装其他数据源(如数据库或 Web 服务)并通过 JSON 接口公开它们的绝佳选择。
当我尝试学习 Node.js 并找到使用现有和可靠模块(如 Django 的美味派)实现 REST API 的最佳方法时;我只是找不到基于模型自动处理这些操作(GET、PUT、POST、DELETE、PATCH)的 node.js 模块。
你会发现很多教程都在说如何实现一个基本的 rest api,但我没有找到可以在大型生产应用程序中使用的模块。(我发现Restify,mers ...)
你们都在用什么?现有模块还是您更喜欢开发自己的控制器来处理这些任务并手动创建自己的路由?
我正在 Node.js 上编写 Restify 应用程序。我需要有一个函数,当 Restify 回调中发生一些错误时调用该函数。此函数应向客户端发送响应。如果我不使用 Promise 或异步函数,我可以这样做:
server.on('uncaughtException', (req, res, route, err) => {
log.error(err);
res.send(err);
});
Run Code Online (Sandbox Code Playgroud)
但是如果我的回调是async函数,那么函数内的异常不会被调用,unhandledPromiseRejection而是被引发。
我该如何重构我的代码,以便像处理通常的错误一样处理未处理的 Promise 拒绝?
是的,我知道我可以检查 Restify 中间件本身内部的错误,但它仍然使代码更复杂,更容易编写
if (!core.validateUUID(req.params.deviceId)) {
throw new Error(`Device ${req.params.deviceId} is wrong`)
}
Run Code Online (Sandbox Code Playgroud)
然后
if (!core.validateUUID(req.params.deviceId)) {
return next(new restify.InvalidArgumentError({ body: {
success: false,
error: `Device ${req.params.deviceId} is wrong`,
} }));
}
Run Code Online (Sandbox Code Playgroud)