如何socket.io结合node js rest API使用www.example.com?

a1o7rhls  于 2023-01-30  发布在  Node.js
关注(0)|答案(2)|浏览(136)

我想用node js rest API做后端,angular 4做前端来构建一个web应用程序,我想使用socket io来实现真实的,如何使用socket io和node js rest api?

jvlzgdj9

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

xdyibdwo

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

这可能会被扩展,但这是一个开始。请让我知道这是有用的,或者如果有这样的讨论正在发生的地方。

相关问题