如何使用socket.io与节点js rest api?

时间:2018-01-13 16:07:49

标签: node.js rest socket.io

我想构建一个web应用程序,节点js rest api作为后端,angular 4作为前端。我想实时使用socket io。如何使用socket io和node js rest api?

2 个答案:

答案 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});

https://socket.io/docs

答案 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\"]"

这可能会扩展,但这是一个开始。请让我知道这是否有用,或者是否正在进行此类讨论。 :-)