一、初始化项目及安装一些包
1、官网克隆种子文件
$ git clone https:
$ cd project
$ npm install
2、安装
graphql
包及
mongoose
包(安装包后可能会报错,需要重新安装
ts-node
)
$ npm install --save @nestjs/mongoose mongoose
$ npm install --save-dev @types/mongoose
$ npm i --save @nestjs/graphql apollo-server-express graphql-tools graphql
二、基本配置
1、新建一个文件夹
graphql
存放
graphql-Module
的文件
import { MiddlewaresConsumer, Module, NestModule, RequestMethod } from '@nestjs/common';
import { GraphQLFactory, GraphQLModule } from '@nestjs/graphql';
import { graphiqlExpress, graphqlExpress } from 'apollo-server-express';
@Module({
imports: [GraphQLModule],
export class GQLModule implements NestModule {
constructor(private readonly graphQLFactory: GraphQLFactory) { }
public configure(consumer: MiddlewaresConsumer): void | MiddlewaresConsumer {
const typeDefs = this.graphQLFactory.mergeTypesByPaths('./src/**/*.graphql');
const schema = this.graphQLFactory.createSchema({ typeDefs });
consumer
.apply(graphiqlExpress({ endpointURL: '/graphql' }))
.forRoutes({ path: '/graphiql', method: RequestMethod.GET })
.apply(graphqlExpress((req) => ({ schema, rootValue: req })))
.forRoutes({ path: '/graphql', method: RequestMethod.ALL });
2、新建一个database
文件夹存放连接mongoose
数据库的module
import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
@Module({
imports: [
MongooseModule.forRoot('mongodb://localhost/nest'),
export class DatabaseModule { }
3、创建一个users
的文件夹(或者叫App
)存放用户的信息
三、关于users
开发的步骤
1、新建文件夹及文件
|-users
|-dto
|- create-user.dto.ts
|-interface
user.interface.ts
schema
user.schema.ts
user.module.ts
user.resolver.ts
user.service.ts
user.types.graphql
2、其中dto
,interface
,schema
,module
,service
跟之前的一样,可以参考
3、resolver
功能和之前的users.controller.ts
类似(我们先往数据库里面插入一条数据)
import { Mutation, Query, Resolver } from '@nestjs/graphql';
import { CreateUserDto } from './dto/create-user.dto';
import { IUser } from './interface/user.interface';
import { UserService } from './user.service';
@Resolver('user')
export class UserResolver {
constructor(private readonly userService: UserService) { }
@Mutation('createUser')
public async createUser(obj: any, args: IUser, context: any, info: any):Promise<IUser> {
return await this.userService.createUser(args);
4、在上面我们在constructor
中注入了UserService
调用了里面的createUser
方法
**user.service.ts**
import { Component } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { IUser } from './interface/user.interface';
import { UserSchema } from './schema/user.schema';
import { CreateUserDto } from './dto/create-user.dto';
@Component()
export class UserService {
constructor( @InjectModel(UserSchema) private readonly userSchema: Model<IUser>) { }
public async createUser(createUserDto: CreateUserDto): Promise<IUser> {
const newUser = new this.userSchema(createUserDto);
return await newUser.save();
5、书写user.types.graphql
文件
注意!
表示必填字段
type User {
_id: String,
name: String,
email: String,
age: Int,
password: String,
createAt: String,
updateAt: String
# 定义Mutation的graphql
type Mutation {
createUser(name: String!, email:String!,age:Int,password:String): User,
6、在user.module.ts
中引入文件
import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { UserSchema } from './schema/user.schema';
import { UserService } from './user.service';
import { UserResolver } from './user.resolver';
@Module({
components: [UserService, UserResolver],
exports: [UserResolver],
imports: [MongooseModule.forFeature([{ name: 'User', schema: UserSchema }])]
export class UserModule { }
7、在app.module.ts
引入相关文件
import { Module } from '@nestjs/common';
import { DatabaseModule } from './database/database.module';
import { GQLModule } from './graphql/gql.module';
import { UserModule } from './users/user.module';
@Module({
imports: [DatabaseModule, GQLModule, UserModule]
export class ApplicationModule { }
四、注意点
1、如果开始跑项目出现问题
(node:7164) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 3): TypeError: buildASTSchema.getDescription is not a function
(node:7164) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
2、如果出现上面的错误的时候你要考虑下npm
包版本的问题
**可以根据需要调整版本号**
"apollo-server-express": "1.3.2",
"graphql": "0.11.7",
"graphql-tools": "2.18.0",
五、再写一个根据用户id
查询出用户的
1、在user.resolver.ts
书写
...
@Query('getUserById')
public async getUserById(obj: any, args: IUser, context: any, info: any):Promise<IUser> {
return await this.userService.getUserById(args._id);
2、在user.service.ts
书写
...
public async getUserById(_id: String): Promise<IUser> {
return await this.userSchema.findById({_id}).exec();
3、user.types.graphql
文件的书写
...
# 定义查询的graphql
type Query {
getUserById(_id: String):User
4、一般步骤是按照前面三点的顺序来写的
六、关于graphql
文件的补充
1、graphQL
官方提供的几种类型(关于复杂的结构可以参考book
这个app
自定义输入数据类型)
Int
:有符号 32 位整数。
Float
:有符号双精度浮点值。
String
:UTF‐8
字符序列。
Boolean
:true
或者 false
。
ID
:ID
标量类型表示一个唯一标识符,通常用以重新获取对象或者作为缓存中的键。ID
类型使用和 String
一样的方式序列化;然而将其定义为 ID
意味着并不需要人类可读型。
2、需要下载客户端GraphiQL
来测试
七、代码下载
python重构go python重写构造函数
构造函数Pythons中的构造函数命名为__init__,在对象创建后可以自动调用它们。>>> class FooBar:
def __init__(self):
self.somever = 42
>>> f = FooBar()
>>> f.somever #省略了之前f.init()的操作
java实现聊天室文件传输 java实现聊天室功能
1、用户 --------> 服务器用户与服务器间交互,而不是用户与用户间交互,也可以理解成只有自己一个人的聊天室,此时不用加入多线程。过程:client A向server发送数据B,server接收此数据B,并将数据B返回发送至A,A再接收server返回回来的数据。 (1)serverimport java.io.DataInputStream;
import java.io.DataO