使用phoenix_api_docs

我想用https://github.com/smoku/phoenix_api_docs来创build一个doc api,但是我遇到了一个问题,正如文档中所指出的那样,我把test_helper.exs放在了这里: PhoenixApiDocs.start ExUnit.start(formatters: [ExUnit.CLIFormatter, PhoenixApiDocs.Formatter]) 当我运行混合testing,控制台显示我这样的: 09:22:51.173 [error] GenEvent handler PhoenixApiDocs.Formatter installed in #PID<0.323.0> terminating ** (UndefinedFunctionError) function WhitespaceEx.Application.Router.__routes__/0 is undefined (module WhitespaceEx.Application.Router is not available) WhitespaceEx.Application.Router.__routes__() (phoenix_api_docs) lib/phoenix_api_docs/generator.ex:26: PhoenixApiDocs.Generator.routes_docs/2 (phoenix_api_docs) lib/phoenix_api_docs/generator.ex:12: PhoenixApiDocs.Generator.run/0 (phoenix_api_docs) lib/phoenix_api_docs/formatter.ex:22: PhoenixApiDocs.Formatter.save_blueprint_file/0 (phoenix_api_docs) lib/phoenix_api_docs/formatter.ex:9: PhoenixApiDocs.Formatter.handle_event/2 (stdlib) gen_event.erl:573: :gen_event.server_update/4 (stdlib) gen_event.erl:555: :gen_event.server_notify/4 (stdlib) gen_event.erl:296: :gen_event.handle_msg/6 (stdlib) proc_lib.erl:247: :proc_lib.init_p_do_apply/3 Last message: {:suite_finished, […]

GET请求的参数数组

例如:我们有以下操作: GET /employees 我必须具有允许使用多个名称作为参数进行筛选的function。 我代表它如下所示: GET /employees?empNames=xxx,yyy,zzz 但是,现在我没有一个名为empName的参数,而是我有两个参数empFirstName和empSurname。 其中将如下所示: GET /employees?empFirstName=xx&empSurname=x 但我仍然需要API来接受多个名称(empFirstName和empSurname)filter。 我可以看到几种方式来表示它: GET /employees?name=(xx,x),(yy,y),(zz,z) GET /employees?name=xx:x,yy:y,zz:z GET /employees?name=[{empFirstName=xx, empSurname=yy},{empFirstName=yy, empSurname=zz},{empFirstName=aa, empSurname=bb}] 什么可能是这种过滤最好的宁静表示。 有什么标准你需要在URI中使用分隔符:a,还是其他的? 什么是最简单和最好的方法来做到这一点?

如何使用Angular 2+,Express和nodeJs上传文件

我试图上传一个图像使用Angular 4,节点和Express与Multer库。 这里是我的route.js: const storage = multer.diskStorage({ destination: function(req, file, cb) { cb(null, 'uploads') }, filename: function(req, file, cb) { cb(null, file.fieldname + '-' + Date.now() + '.jpg') } }); const upload = multer({ storage: storage }).single('avatar'); router.post('/upload_avatar', function(req, res) { upload(req, res, function(err) { if (err) { // An error occurred when uploading throw […]

覆盖需要从根启动并检查节点模块而不更改其名称

我试图分享我的客户端和服务器代码,我想要一个整洁的方式要求我的依赖。 我目前使用webpack作为我的构build工具,并将其设置为parsing到我的资产/ js文件夹,所以我的客户端依赖关系如下所示: require('validators/login.js'); 我希望在整个服务器上分享完全相同的代码,但是我不想把if语句放进来检查是否服务器或客户端正在执行这个请求,所以我可以做类似于 if server rootRequire.. else require 我想要的服务器使用需求像客户端一样,并从根目录开始,但我也不想剥离它的function来searchnode_modules文件夹,如果它不返回结果。 我也想这样做,而不是把我所有的代码放在node_modules文件夹中。 有没有人有一些好的build议,如何正确地覆盖需求? 我已经阅读了大部分的hacky解决scheme,比如使用符号链接或者在node_modules中放置东西,我不想find这些答案,我想要一些干净的,实际上覆盖正确的东西。

TypeError:不能使用'in'运算符在中search'_id'

我不断地收到错误消息“TypeError:不能在'运算符'中search”+“mongoose”,“body-parser”,“./config”中的_id“…显然任何依赖。 我努力了: 确保我的模型/模式是正确的,如下所示: TypeError:不能使用'in'运算符来search男性中的'_id' 完全注释掉req.body的任何提及,以避免导致错误的任何可能性,如下所述: TypeError:不能使用'in'运算符在[{}]和这里search'_id' : Mongoose TypeError :不能使用'in'运算符来search[object Object]中的'_id' 读这个,但不知道这里发生了什么: Mongoose TypeError:不能使用'in'运算符来search'_id'in 我尝试了一些我认为可能导致问题的config.js文件。 (见下文) 我甚至尝试完全注释掉这些违规的依赖项(比如var config = require('./config') ),这显然不是一个可行的长期解决scheme,但也没有摆脱我的错误。 相反,这只是将错误转移到了不同​​的依赖关系上(例如,现在这与mongoose本身有关)。 所以现在我很难过 这是我的用户模型: "use strict"; var mongoose = require('mongoose'); var userSchema = new mongoose.Schema({ username: { type: String, required: false}, password: { type: String, required: false} }); var user = mongoose.model('user', userSchema); module.exports = […]

使用server.listen()处理错误(如EADDRINUSE)

我一直困惑/烦恼, server.listen()不采取错误优先callback: server.listen(port, function(){ // the first argument is *not* a potential error }); 一定是一个艰难的devise决定,不要将错误传递给listen()。 看来我们应该在这里处理错误: server.on('error', (e) => { if (e.code === 'EADDRINUSE') { console.log('Address in use, retrying…'); } }); 但我担心的是, server.on('error' )可能会触发多次,而不仅仅是当服务器启动。 如果EADDRINUSEtypes的错误被引发并返回到server.listen()callbackEADDRINUSE将会更加方便。 有一些我可以用来传回错误的模式,如下所示: exports.startServer = function(data, cb){ server.listen(data, cb); server.once('error', cb); }); 上面的代码是否安全,这样cb才会只发一次? 这不安全! 大声笑。 因为我们需要删除“错误”侦听器,如下所示: exports.startServer = function(data, cb){ let onError […]

刷新Google API令牌以保持用户login状态

我正在开发一个使用Google日历的Google操作应用程序。 在用户第一次互动开始时,系统会提示他们链接其Google帐户以访问日历。 但是对于几乎每个将来的交互,用户都必须再次进行authentication。 我的代码从用户数据获取访问令牌如下。 我不确定是否有办法将刷新令牌添加到凭据中。 我已经看到你应该在其他答案的请求中包含"access_type": "offline" ,但是我不确定将它放在我的代码中。 任何帮助将不胜感激! const googleAuth = require('google-auth-library'); function getAuth(app) { var accessToken = app.getUser().accessToken; var clientId = CLIENT_ID; var clientSecret = CLIENT_SECRET; var redirectUrl = 'https://oauth-redirect.googleusercontent.com/r/my_app_name'; var auth = new googleAuth(); var oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUrl); var token = { "access_token": accessToken, "refresh_token": "", "access_type": "offline", //Not […]

Nodejs Mongodb第二次sorting()第一次sorting()的结果

格式想要出现 – msg – 9 … msg – 17 msg – 18 msg – 19 从这个function mongo.connect(mongourl, function (err, db) { var collection = db.collection('chat') var stream = collection.find().sort({ _id : -1 }).limit(10).stream(); stream.on('data', function (chatt) {clients[socket.id].emit('chat message', chatt.content); }); });}); 但这种sorting只能给我 – msg – 19 msg – 18 msg – 17 … msg – […]

在NodeJs 8. *如何在http.get上应用Async / Await?

下面的代码从指定的url中asynchronous获取结果,并且在接收到数据后,使用nodejs版本8中的asynchronous/等待(*)(不带callback函数),我想从getData方法中返回parsedvariables。 function getData(v, r) { var path = 'http://some.url.com'; var parsed = ""; http.get({ path: path }, function(res) { var body = ''; res.on('data', function(chunk) { body += chunk; }); res.on('end', function() { parsed = JSON.parse(body); // now I would like to return parsed from this function without making use of callback functions, and make […]

使用API​​网关和Lamda从S3服务PDF文件

我有nodejs lamda函数读取从s3桶s3文件,并由api网关使用Lamda代理服务 function readS3(bucket,objectName){ return new Promise((resolve, reject) => { AWS.S3.getObject({ Bucket: bucket, Key: objectName }, function (err, data) { if (err) { console.log('cannot read s3'); console.log(err, err.stack); reject(err); } else { resolve(data); } }); }); } readS3(bucket,objName).then((data)=>{ let response = { statusCode:200, headers: { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Credentials": true, "Content-Type": 'application/pdf', "Content-Disposition": 'filename=test.pdf' }, body: […]