[英]How to get client ip address on an apollo subscriptions server?
您可以使用context.request.connection.remoteAddress
获取客户端的 IP 地址。
例如
import http from 'http';
import { ApolloServer, gql, PubSub } from 'apollo-server-express';
import express from 'express';
const pubsub = new PubSub();
const POST_ADDED = 'POST_ADDED';
const db: { posts: any[] } = {
posts: [],
};
const typeDefs = gql`
type Subscription {
postAdded: Post
}
type Query {
posts: [Post]
}
type Mutation {
addPost(author: String, comment: String): Post
}
type Post {
author: String
comment: String
}
`;
const resolvers = {
Subscription: {
postAdded: {
subscribe: () => pubsub.asyncIterator([POST_ADDED]),
},
},
Query: {
posts(root, args, context) {
return db.posts;
},
},
Mutation: {
addPost(root, args, context) {
pubsub.publish(POST_ADDED, { postAdded: args });
const post = { ...args };
db.posts.push(post);
},
},
};
const PORT = 4000;
const app = express();
const server = new ApolloServer({
typeDefs,
resolvers,
subscriptions: {
onConnect: (connectionParams, webSocket, context) => {
console.log('remote address: ', context.request.connection.remoteAddress);
console.log('websocket connected');
},
onDisconnect: (webSocket, context) => {
console.log('websocket disconnected');
},
},
});
server.applyMiddleware({ app });
const httpServer = http.createServer(app);
server.installSubscriptionHandlers(httpServer);
httpServer.listen(PORT, () => {
console.log(`🚀 Server ready at http://localhost:${PORT}${server.graphqlPath}`);
console.log(`🚀 Subscriptions ready at ws://localhost:${PORT}${server.subscriptionsPath}`);
});
调试日志:
🚀 Server ready at http://localhost:4000/graphql
🚀 Subscriptions ready at ws://localhost:4000/graphql
remote address: ::1
websocket connected
我测试它本地主机,所以客户端 IP 地址是::1
。 ::1
是“IPv6 中的环回地址”,又名 localhost。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.