我想构建一个web应用程序,节点js rest api作为后端,angular 4作为前端。我想实时使用socket io。如何使用socket io和node js rest api?
答案 0 :(得分:0)
Web套接字会派上用场。表示您要进行全双工通信。 用法: npm我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});
答案 1 :(得分:0)
所以我一直在寻找有关此问题的讨论,但是我只是实现了一些东西,我想分享一下,看看是否能得到任何反馈。我认为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\"]"
这可能会扩展,但这是一个开始。请让我知道这是否有用,或者是否正在进行此类讨论。 :-)