天道酬勤,学无止境

node.js

How to get specific cookie value in socket.io

问题 我现在可以使用socket.request.headers.cookie显示所有 cookie。 当我控制台输出是这样的 PHPSESSID=mtklg8k81cpkop5ug6aechbb34; user=77; io=1Klg6xgTRXhb2OWiAAAA 我怎样才能只获得 77 的用户价值? 下面的代码给我一个未定义的错误 var cookief = socket.request.headers.cookie; console.log(cookief['user']); 回答1 您必须将 cookie 解析为它们单独的 cookie 和属性。 通常使用的模块是 cookie-parser。 要与 socket.io 一起使用,您可以使用一个小的包装器来与 socket.io 一起使用,称为 socket.io-cookie-parser。 const cookieParser = require('socket.io-cookie-parser'); io.use(cookieParser()); io.on('connection', function(socket) { // access socket.request.cookies console.log(socket.request.cookies['user']; });

2022-07-11 09:59:07    分类:技术分享    javascript   node.js   cookies   socket.io

Running mocha tests synchronously

问题 我有以下设置来运行“it”测试: X is environment variable if( X == "all" || X == "some value" ) read directory and run test using it() with callbacks if( X == "all" || X == "some other value") read directory and run some it() tests with callback 我面临的问题是当我给出“一些价值”或“一些其他价值”时,所有的 it() 测试都运行得很好。 但是当环境变量为“all”时,在运行第一个 it() 测试时,会出现第二个 if 语句的目录内容。 我正在使用 fs.readdirSync(dir) 来读取内容,并且我知道 mochatest 异步运行它们,因此,第二个目录的内容出现在第一个测试中。 是否可以阻止第二个 if 语句的执行,直到第一个 if 中的所有 it() 测试成功完成? 或使其同步运行的任何替代方法。 回答1 在 Mocha 中, it()测试可能会阻塞,直到您说它完成为止。 只需将“完成”回调传递给测试函数,如下所示: it( "running test", function( done ) { //do stuff, even async

2022-07-11 09:38:54    分类:技术分享    node.js   mocha.js

How to prevent login more than once from same user in nodejs chat application?

问题 我正在使用Socket.io和Express来制作聊天应用程序。 聊天是匿名的,我不想在任何数据库中保存任何内容。 我可以考虑检查用户的 IP 地址并防止从同一 IP 地址再次登录,但我认为这不是一个好主意,因为人们使用共享 IP 地址在线。 另一件事是会话 ID,但即使用户从浏览器中的不同选项卡登录,它也会发生变化。 有没有不使用任何数据库的简单方法来做到这一点? 最好不安装任何其他包/库? 回答1 express.session 中间件使用基于 cookie 的会话,默认情况下只存储在内存中而不是数据库中。 如果用户打开新标签,基于 cookie 的会话不会改变。 这篇文章在 SO 的其他地方被提到,作为使用 socket.io 的快速会话的一个很好的参考。 通常,您只需在 socket.io ( sio.set('authorization', authCallback) ) 中进行授权时检查会话,然后您的应用程序可以使用户连接到正确的房间。 更新:(更具体地说明如何使用 cookie 阻止用户) // Var to save if the user is connected or not var connectedUsers = []; sio.authorization(function(data, next){ var cookie = data.headers

2022-07-11 09:34:04    分类:技术分享    node.js   express   socket.io

Nodejs calling function from within a function

问题 我有 3 种方法 exports.getImageById = function (resultFn, id) { ... } exports.getCollectionById = function (resultFn, id) { } 在第三种方法中,我想同时调用这两种方法 exports.getCollectionImages = function (resultFn, collectionId) { var arr = new Array(); this.getCollectionById( // fine, 1st call function (result) { var images = result.image; for (i = 0; i < images.length; i++) { this.getImageById(function (result1) { // error, 2nd call arr[i] = result1; }, images[i] ); } } , collectionId ); resultFn(arr); } 我可以调用第一个函数this.getCollectionById但它无法调用this.getImageById ,它说未定义函数,这是什么原因? 回答1 当您调用this.getCollectionById向它传递回调时

2022-07-11 09:33:09    分类:技术分享    javascript   node.js   function

How to get sub document only in mongoose?

问题 我正在尝试从具有以下架构的数组中仅提取子文档: const UserSchema = Schema({ name: { type: String },library:[{ story:{type: Schema.Types.ObjectId,ref: 'Story'} }], }); 我尝试使用: module.exports.getUserStories = function(userId, callback){ User.findOne({_id: userId },callback) .select('library.story') }; 它给出了这个结果: { "_id": "5949615072e15d2b34fa8f9d", "library": [ { "story": "592ae46cf2a0ba2b208cb092" }, { "story": "592ae608df26d80790092fe9" }, { "story": "592ae46cf2a0ba2b208cb092" } ] } 但我期望得到的只是这个: [ { "story": "592ae46cf2a0ba2b208cb092" }, { "story": "592ae608df26d80790092fe9" }, { "story": "592ae46cf2a0ba2b208cb092"

2022-05-17 05:20:17    分类:技术分享    json   node.js   mongoose

Require function inside <script> node.js

问题 我可以在脚本标签中放置一个 require 函数吗,例如: <script> var User = require('../models/user'); alert('It is working'); </script> 上面的代码是我的 layout.handlebar 代码。 但它似乎不起作用。 因为我需要获取此脚本,以便我可以访问我的车把模板引擎上的 user.js 脚本。 用户.js var mongoose = require('mongoose'); var bcrypt = require('bcryptjs'); //User Schema var UserSchema = mongoose.Schema({ username:{ type: String, index:true }, password:{ type:String }, email:{ type:String }, name:{ type:String }, field:{ type:String }, e_money:{ type:Number //this is the integer form in mongoose } }); //accesible variable from the outside var User = module.exports = mongoose.model

2022-05-17 05:00:08    分类:技术分享    javascript   node.js   handlebars.js   mongoose-schema

how to make express route private accessible

问题 我正在运行一个 nodejs/express 应用程序作为我当前项目的后端解决方案。 该应用程序正在使用 passport-jwt 来保护一些路由,其中​​ JWT 作为路由的标头授权,我们将此路由称为secure-route 。 现在我正在运行第二个应用程序,它需要在没有必要的授权标头的情况下访问安全路由。 必要的 Authorization 头是在用户授权成功后由登录路由生成的。 问题是,我不想提供(假)jwt Authorization 标头(不应过期)。 第二个应用程序/服务器应该使用更合适的授权策略(如基本身份验证)访问我的第一个应用程序。 我想过在另一个路由器模块中将安全路由设为私有,这样我就可以通过重新路由来访问这个私有路由。 那么我怎样才能使快速路线私有可访问? 或者是否有在不影响当前身份验证策略的情况下对后端/服务器进行身份验证的解决方案? 编辑:两个后端都在 AWS 上的无服务器结构上运行 回答1 假设您提到的第二个应用程序在同一台服务器或同一网络中的另一台服务器上运行,那么您可以执行以下操作: 在普通 Internet 无法访问的非标准端口上创建一个新的 Web 服务器(使用 Express 只需几行代码)。 在运行安全路由的现有服务器所在的同一 nodejs 进程中运行该新 Web 服务器。 在该新服务器中,为私有访问创建一个路由。 在该私有路由中

2022-05-17 04:55:11    分类:技术分享    node.js   express   authorization   jwt

form-data library throwing cannot read property of null error when trying append attachments to send via request.post

问题 当我尝试使用附件的form-data发出request.post时,我收到以下错误。 错误来自表单数据库。 var filename = options.filename || value.name || value.path; ^ TypeError: Cannot read property 'name' of null 这就是我的表单构造和附加的样子。 我基本上附加了一个 JSON Web 令牌和一个图像文件。 var formData = new FormData(); formData.append('jwt', jwt); var imgToAttach = fs.createReadStream(path.join(__dirname, 'abc.jpg')); formData.append('attachmentA', imgToAttach); sendRequest(formData); sendRequest 函数如下所示。 function sendRequest(formData) { var reqOptions = { url: options.host, formData: formData, headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }; request

2022-05-17 04:52:03    分类:技术分享    javascript   node.js   request   form-data

WebSocket connection failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED

问题 我是 WebRTC 和 WebSockets 的新手,并且正在按照本教程创建 WebRTC 演示项目,但我无法创建 WebSocket 连接。 我遵循了项目中提到的相同步骤。 他的项目在 8080 端口上运行,他提到了 ws://localhost:9090。 我的项目在8081端口上运行,但是我复制了他的URL ws://localhost:9090,因为我不知道9090的意义,我收到了这个错误,我的服务器是node.js。 我也将本地主机更改为 8081,但随后出现握手错误。 WebSocket 连接到“ws://localhost:9090/”失败:连接建立错误:net::ERR_CONNECTION_REFUSED。 回答1 回答2 回答3 回答4 我想这是一个通用的 websocket 问题。 使用内置location.host变量将 url 更改为动态名称,并更改协议以保护 websocket wss (如果您已设置 TLS): const ws = new WebSocket("wss://" + location.host + "/") 回答5 const ws = new WebSocket('ws://localhost:8080/chat') 回答6 回答7

2022-05-17 04:37:03    分类:技术分享    javascript   node.js   websocket   webrtc