好事发生
《腾讯IMA:AI智能工作台的革命性创新》
这里推荐一篇实用的文章:https://cloud.tencent.com/developer/article/2467267?shareByChannel=link
这篇文章深入解析了IMA Copilot的功能和应用场景,并通过与OpenAI Canvas的对比,帮助读者更好地理解不同AI写作工具的特点。对于关注AI技术在内容创作领域应用的读者而言,本文提供了有价值的参考。
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(3000, () => {
console.log('Server running on port 3000');
});
body - parser
中间件来解析 POST 请求中的 JSON 数据: const bodyParser = require('body - parser');
app.use(bodyParser.json());
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
@Module({
controllers: [CatsController],
providers: [CatsService],
})
export class CatsModule {}
import { Controller, Get } from '@nestjs/common';
import { CatsService } from './cats.service';
@Controller('cats')
export class CatsController {
constructor(private catsService: CatsService) {}
@Get()
async findAll() {
return this.catsService.findAll();
}
}
const {Model, DataSource} = require('loopback');
const ds = new DataSource('memory');
class User extends Model {}
User.attachTo(ds);
User.modelName = 'User';
const {Connector, DataSource} = require('loopback');
const mysqlConnector = Connector.extend('mysql', require('loopback - connector - mysql'));
const ds = new DataSource('mysqlDS', {
connector: mysqlConnector,
host: 'localhost',
port: 3306,
database: 'mydb',
username: 'user',
password: 'password'
});
const Hapi = require('hapi');
const server = new Hapi.Server({
port: 3000,
host: 'localhost'
});
server.route({
method: 'GET',
path: '/',
handler: (request, h) => {
return 'Hello World';
}
});
hapi - vision
插件来支持模板引擎: const Inert = require('hapi - inert');
const Vision = require('hapi - vision');
const server = new Hapi.Server({...});
await server.register([
Inert,
Vision
]);
为什么选Koa
缺点:轻量级过于灵活,缺少内置功能 想怎么写就怎么写。。。
ps:这里2年前用koa写的了,现在公司在使用NestJS,所有后续还会用NestJS重构一下,体验不同框架之间的差别和优劣、开发体验等等
app.js
今天先讲讲全局错误处理和异步 Promise
InitManager.initCore(app)
require('module-alias/register')
const Koa = require('koa');
const path = require('path');
const bodyParser = require('koa-bodyparser');
const static = require('koa-static');
const catchError = require('@middlewares/exception');
const InitManager = require('@core/init');
// 自动建标表
require('@models/index');
const app = new Koa();
// 全局错误处理
app.use(catchError);
// 使用ctx.body解析中间件 ctx.request.body
app.use(bodyParser());
// 静态资源
app.use(static(path.join(__dirname, './static')))
// 注册 中间键 上下文ctx 洋葱模型
// 异步 Promise
InitManager.initCore(app);
app.listen(3000, () => {
console.log('启动 3000')
});
洋葱模型在这里就不多赘述了,后面有机会单独出一篇文章,这里先应用
const catchError = require('@middlewares/exception');
const app = new Koa();
// 全局错误处理
app.use(catchError);
catchError
middlewares/exception.js
统一处理错误信息 msg、errorCode、request等等 这里还可以加上traceId 请求唯一值查询日志等等
const { HttpException } = require('../core/http-exception')
const catchError = async (ctx, next) => {
try {
await next();
} catch (error) {
const isHttpException = error instanceof HttpException;
const isDev = global.config.environment === 'dev';
if (isDev && !isHttpException) {
throw error;
}
if (error instanceof HttpException) {
const { msg, errorCode, code } = error;
ctx.body = {
msg: msg,
error_code: errorCode,
request: `${ctx.method} ${ctx.path}`
};
ctx.status = code;
} else {
ctx.body = {
msg: 'we made a mistake',
error_code: 999,
request: `${ctx.method} ${ctx.path}`
};
ctx.status = 500;
}
}
}
module.exports = catchError;
core/http-exception
这个构造函数的目的是创建一个特定的错误对象,用于在应用程序中表示资源未找到的情况。通过继承 HttpException
,它可以与其他 HTTP 异常类一起使用,提供统一的错误处理机制。
class HttpException extends Error{
constructor(msg = '服务器异常', errorCode = 10000, code = 400) {
super();
this.errorCode = errorCode;
this.code = code;
this.msg = msg;
}
}
class ParameterException extends HttpException {
constructor(msg, errorCode) {
super();
this.code = 400;
this.msg = msg || '参数错误';
this.errorCode = errorCode || 10000;
}
}
class Success extends HttpException {
constructor(msg, errorCode) {
super();
this.code = 200;
this.msg = msg || 'ok';
this.errorCode = errorCode || 0;
}
}
class NotFound extends HttpException{
constructor(msg, errorCode) {
super();
this.msg = msg || '资源未找到';
this.errorCode = errorCode || 10000;
this.code = 404;
}
}
class AuthFailed extends HttpException{
constructor(msg, errorCode) {
super();
this.msg = msg || '授权失败';
this.errorCode = errorCode || 10004;
this.code = 401;
}
}
class Forbidden extends HttpException {
constructor(msg, errorCode) {
super();
this.msg = msg || '禁止访问';
this.errorCode = errorCode || 10006;
this.code = 403;
}
}
module.exports = {
HttpException,
ParameterException,
Success,
NotFound,
AuthFailed,
Forbidden,
};
init.js
const Router = require('koa-router');
const requireDirectory = require('require-directory');
class InitManager {
static initCore(app) {
InitManager.app = app
InitManager.initLoadRouters();
InitManager.loadHttpException();
InitManager.loadConfig();
}
static loadConfig(path = '') {
const configPath = path || process.cwd() + '/config/config.js'
const config = require(configPath)
global.config = config
}
static initLoadRouters() {
const path = `${process.cwd()}/app/api/`
const visitor = function (obj) {
if (obj instanceof Router) {
InitManager.app.use(obj.routes())
}
}
requireDirectory(module, path, { visit: visitor })
}
static loadHttpException() {
const errors = require('./http-exception')
global.errs = errors
}
}
module.exports = InitManager;
开始工作已完成
后续就是编写api了
未完待续,koa开发持续更新中...
感谢关注点赞评论~
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。