我想用node js rest API做后端,angular 4做前端来构建一个web应用程序,我想使用socket io来实现真实的,如何使用socket io和node js rest api?
jvlzgdj91#
当你想进行实时交互式通信时,网络套接字就派上用场了。这意味着你想要全双工通信。用法:国家预防机制socket.io
io.on('connection', socket => {socket.emit('request', /* … */); // emit an event tothe socketio.emit('broadcast', /* … */); // emit an event to all connected socketssocket.on('reply', () => { /* … */ }); // listen to the event});
https://socket.io/docs
xdyibdwo2#
所以我一直在寻找一个关于这个问题的讨论,但是我刚刚实现了一些东西,我想分享一下,看看我是否能得到任何反馈。我认为socket.io是实现API的一个很好的方式,特别是对于双向通信和实时通信。这里是一个开始:在服务器端创建此文件- socket-api-server:
"use strict"; const serverIo = require("socket.io"); const server = serverIo.listen(process.env.PORT || 8000); const api_keys=JSON.parse(process.env.SOCKET_API_KEYS|| "[]"); /** * Server Side * */ function socketAPIServer(apis){ server.on("connection", (socket) => { // this must be first - to block unauthenticated access to the APIs socket.use((packet,next)=>{ if(socket.auth) return next(); else if(packet[0]==="authenticate" && api_keys.includes(packet[1])){ socket.auth=true; socket.emit("authenticated") return next(); } else return next(new Error("unauthorized")); }) socket.on("disconnect", () => { delete socket.auth; }); apis.forEach(api=>{ socket.on(api.name,api.func) }) }); } module.exports=socketAPIServer;
然后我将API放在一个文件中-但您可以将它们作为单独的文件:
const APIs=[ { name: "api_name", func: (p1, p2,..., cb)=>{ cb(figure out what to send ) } }, { name: "another_api_name", func: (p1,cb)=>{ cb( calculate something from p1) } } ]; socketAPIServer(APIs);
在客户端,我有一个文件,如下所示:
const clientIo = require("socket.io-client"); // ensure ENV keys if (!process.env.API_KEY) { console.error("API_KEY needed. On bash use: export API_KEY=\"your-key-here\" or add it to your .bashrc file") process.exit(); } // ensure ENV keys if (!process.env.API_URL) { console.error("API_URL needed. On bash use: export API_URL=\"your-key-here\" or add it to your .bashrc file") process.exit(); } const ioClient = clientIo.connect(process.env.API_URL); var authenticated=false; var queued=[]; ioClient.on('connect',()=>{ console.info("client connected", ioClient.id); ioClient.emit('authenticate', process.env.API_KEY); ioClient.on("authenticated",()=>{ authenticated=true; while(queued.length) queued.shift()(); }) }); function socketAPI(...args) { if(args[0]==='disconnect') return ioClient.close(); if(!authenticated) queued.push(()=>ioClient.emit(...args)) else ioClient.emit(...args) } module.exports=socketAPI;
然后,您可以这样使用它:
var socketAPI=require('./socketAPI'); socketAPI("api_name",p1,p2,results=>{ console.info(results); })
用于测试装置
export API_URL="http://localhost:8000" export API_KEY="a long random string" export API_KEYS="[\"a long random string\"]"
这可能会被扩展,但这是一个开始。请让我知道这是有用的,或者如果有这样的讨论正在发生的地方。
2条答案
按热度按时间jvlzgdj91#
当你想进行实时交互式通信时,网络套接字就派上用场了。这意味着你想要全双工通信。用法:国家预防机制socket.io
https://socket.io/docs
xdyibdwo2#
所以我一直在寻找一个关于这个问题的讨论,但是我刚刚实现了一些东西,我想分享一下,看看我是否能得到任何反馈。我认为socket.io是实现API的一个很好的方式,特别是对于双向通信和实时通信。这里是一个开始:
在服务器端创建此文件- socket-api-server:
然后我将API放在一个文件中-但您可以将它们作为单独的文件:
在客户端,我有一个文件,如下所示:
然后,您可以这样使用它:
用于测试装置
这可能会被扩展,但这是一个开始。请让我知道这是有用的,或者如果有这样的讨论正在发生的地方。