Thứ Ba, 13 tháng 4, 2021

Response trong AdonisJS




## Basic Response
1. Trả về một chuỗi
Route.get('/', ({ response }) => {
response.send('hello world')
})

2. Trả về một một mảng danh sách users với JSON format

Route.get('/users', async ({ response }) => {
const users = await User.all()
response.send(users)
})

hoặc

Route.get('/users', async ({ response }) => {
response.json(await User.all())
})

## Cải tiến
1. Trả về kết quả một cách tự nhiên nhất, không cần sử dụng helper response
Route.get('/', async () => {
return await User.all()
})

2. Tránh sử dụng callback
Route.get('/', async ({ response }) => {
// gọi callback lấy nội dung của một file
fs.readFile('somefile', (error, contents) => {
response.send(contents)
})
})
==> Code trên sẽ bị quăng ra một lỗi vì AdonisJs sẽ xử lý
và trả về response ngay khi nó được gọi và callback sẽ được gọi sau.

2. b) Sử dụng promisify cho callback của bạn và sử dụng nó với await
const fs = use('fs')
const Helpers = use('Helpers')
const readFile = Helpers.promisify(fs.readFile)

Route.get('/', async ({ response }) => {
// chờ kết quả được trả về sau khi đã đọc hết nội dung file
return await readFile('somefile')
})

2. c) Nếu bạn vẫn thực sự muốn dùng callback
Route.get('/', async ({ response }) => {
response.implicitEnd = false // thêm vào dòng này

fs.readFile('somefile', (error, contents) => {
response.send(contents)
})
})

Tuy nhiên AdonisJS không khuyến nghị bạn dùng callback.

## Kiểm soát Header Response
1. thiết lập các giá trị header có trong response
> response.header('Content-type', 'application/json')

2. Chỉ thiết lập nếu nó chưa có
> response.safeHeader('Content-type', 'application/json')

3. Xóa một giá trị
> response.removeHeader('Content-type')

4. Thiết lập Content-Type
> response.type('application/json')

## Response Cookies
1. Thiết lập cookie value
> response.cookie('cartTotal', 20)

2. Xóa cookie value
> response.clearCookie('cartTotal')

3. Trả về giá trị của cookie không bị mã hóa
> response.plainCookie('cartTotal', 20)

## Redirects
Một số trường hợp sau khi xử lý xong ta cần di chuyển đến trang khác

1. `response.redirect`
Cú pháp : `redirect(url, [sendParams = false], [status = 302])`

> response.redirect('/url')
> response.redirect('/url', false, 301)

Nếu muốn gửi tất cả các parameters của request hiện tại đến url mà ta sẽ redirect
thì thêm true vào tham số thứ 2 của function redirect:
> response.redirect('/url', true)

2. Redirect đến một route
Ví dụ: Route .get('users/:id', 'UserController.show') .as('profile')

- thông qua route name: `response.route('profile', { id: 1 })`
- thông qua controller method: `response.route('UserController.show', { id: 1 })`
- chỉ định domain: `response.route('posts', { id: 1 }, 'blog.adonisjs.com')`

## Attachments
Gửi file(images, videos...) đến users

1. download(filePath)
> response.download(Helpers.tmpPath('uploads/avatar.jpg'))
File có thể tự mở bởi trình duyệt.

2. attachment(filePath, [name], [disposition])
File không mở bởi trình duyệt, mà sẽ download về máy của users.

<!-->
response.attachment(Helpers.tmpPath('uploads/avatar.jpg'))
response.attachment(
Helpers.tmpPath('uploads/avatar.jpg'),
'myAvatar.jpg' // custom name
)
-->

## Các phương thức (method) mô tả HTTP Method Code
Before: response.status(401).send('Login First')
After: response.unauthorized('Login First')

Method Http Response Status
continue 100
switchingProtocols 101
ok 200
created 201
accepted 202
nonAuthoritativeInformation 203
noContent 204
resetContent 205
partialContent 206
multipleChoices 300
movedPermanently 301
found 302
seeOther 303
notModified 304
useProxy 305
temporaryRedirect 307
badRequest 400
unauthorized 401
paymentRequired 402
forbidden 403
notFound 404
methodNotAllowed 405
notAcceptable 406
proxyAuthenticationRequired 407
requestTimeout 408
conflict 409
gone 410
lengthRequired 411
preconditionFailed 412
requestEntityTooLarge 413
requestUriTooLong 414
unsupportedMediaType 415
requestedRangeNotSatisfiable 416
expectationFailed 417
unprocessableEntity 422
tooManyRequests 429
internalServerError 500
notImplemented 501
badGateway 502
serviceUnavailable 503
gatewayTimeout 504
httpVersionNotSupported 505

## Tự viết thêm các functions cho Response
Bạn có thể tự viết thêm các functions mới cho Response sử dụng macro.
Sau đó đăng kí sử dụng với providers hoặc Ignitor hooks.
Đọc thêm chi tiết: https://adonisjs.com/docs/4.1/extending-adonisjs
<!-->
const Response = use('Adonis/Src/Response')

Response.macro('sendStatus', function (status) {
this.status(status).send(status)
})
-->


Không có nhận xét nào:

Đăng nhận xét

Học lập trình web căn bản với PHP

Bài 1: Các kiến thức căn bản Part 1:  https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-1-cac.html Part 2:  https://...